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::coutIAnimal
不会覆盖虚拟尖叫
功能
因此,即使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
}