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

C++ 基类可以实现显式接口吗?,c++,visual-c++,visual-studio-2015,multiple-inheritance,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()

一个片段可以说一千多个单词。是否有一种方法可以使以下工作正常进行,如果没有,原因是什么

#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
}
#包括
#包括
ISquealer类
{
公众:
虚空尖叫()=0;
};
类defaultsquel:public ISquealer//可能是其他的
{
公众:
虚拟void squelle()覆盖
{

std::cout
IAnimal
不会覆盖虚拟
尖叫
功能

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

相反,如果
Pig
重写了
squele
函数,那么它将编译:

class Pig : public IAnimal, public DefaultSqueel
{
    virtual std::string getName() { return "Piggy"; }
    virtual void squeale() override
    {
        DefaultSqueel::squeale() ; //to avoid reimplementing
    }
};
如果您查看继承关系图,那么很明显从
ISquealer继承两次没有任何好处:

如果只有来自
ISquealer
的单一继承,则代码还编译:

#包括
#包括
ISquealer类
{
公众:
虚空尖叫()=0;
};
类defaultsquel:public ISquealer//可能是其他的
{
虚拟void squelle()覆盖
{

std::你能不能不说它工作时应该做什么。你想实现什么?代码片段已损坏,因此无法“使其工作”当你不说它应该做什么时,我添加了一个编辑来澄清。错误是当我假设抽象方法将由DefaultSqueel基类实现时,“Pig”是抽象的。我想知道为什么是这样,以及我如何修复它。是故意的
squeale()
defaultsquel
中是私有的吗?@tobi303不,这是一个错误。但似乎没有什么区别。嗯,是的,但我会在Pig中使用ISqueale实现,这是我试图避免的。从ISqueale中删除IAnimal的继承-这是具有不同函数集的不同接口…或者调用defaultsquel::来自清管器的尖叫声::尖叫声()
#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
}