基类可以实现显式接口吗?

时间:2017-08-30 19:13:15

标签: c++ visual-c++ visual-studio-2015 multiple-inheritance

一个片段可以说千言万语。有没有办法做以下工作,如果没有,为什么?

#include <iostream>
#include <string>

class ISquealer
{
public:
    virtual void squeale() = 0;
};

class DefaultSqueel : public ISquealer // May be others
{
public:
    virtual void squeale() override
    {
        std::cout << "Squeeaale!!";
    }
};

class IAnimal : public ISquealer
{
public:
    virtual std::string getName() = 0;
};

class Pig : public IAnimal, public DefaultSqueel
{
public:
    virtual std::string getName() { return "Piggy"; }
};


int main()
{
    Pig pig; // object of abstract type 'Pig' is not allowed
}

编辑:

只是为了澄清什么是错的:这不会编译,因为编译器认为Pig是抽象的,因此即使squeale方法实际上是在Pig继承层次结构中实现的,也无法实例化。

1 个答案:

答案 0 :(得分:2)

IAnimal不会覆盖虚拟squeale功能。

因此即使Pig继承自DefaultSqueel,编译器也不满意继承的IAnimal部分仍不是虚拟的。

相反,如果Pig覆盖了squeale函数,那么它就会编译:

class Pig : public IAnimal, public DefaultSqueel
{
    virtual std::string getName() { return "Piggy"; }
    virtual void squeale() override
    {
        DefaultSqueel::squeale() ; //to avoid reimplementing
    }
};

如果查看继承图,那么很明显,从ISquealer继承两次没有任何好处:

enter image description here

如果ISquealer只有一个继承,那么代码也会编译:

enter image description here

#include <iostream>
#include <string>

class ISquealer
{
public:
    virtual void squeale() = 0;
};

class DefaultSqueel : public ISquealer // May be others
{
    virtual void squeale() override
    {
        std::cout << "Squeeaale!!";
    }
};

class IAnimal 
{
    virtual std::string getName() = 0;
};

class Pig : public IAnimal, public DefaultSqueel
{
    virtual std::string getName() { return "Piggy"; }
};


int main()
{
    Pig pig; // object of abstract type 'Pig' is not allowed
}