一个片段可以说千言万语。有没有办法做以下工作,如果没有,为什么?
#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继承层次结构中实现的,也无法实例化。
答案 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
继承两次没有任何好处:
如果ISquealer
只有一个继承,那么代码也会编译:
#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
}