假设我有一个带有虚方法的类和两个以不同方式定义该方法的派生类:
class animal
{
virtual bool isBlack() = 0;
};
class blackAnimal : public animal
{
virtual bool isBlack() { return true; }
};
class stripedAnimal : public animal
{
virtual bool isBlack() { return false; }
};
现在我想从虚拟基类派生另一个类,并创建两个新的子类型:
class bigCat : public animal {}; // isBlack() is still pure virtual
// I wish that this worked and that isBlack would return true
class jaguar : public bigCat, public blackAnimal {};
// I wish that this worked and that isBlack would return false
class tiger : public bigCat, public stripedAnimal {};
我该怎么做?当我这样做时,动物的isBlack()方法保持虚拟。当我从一个定义了animal :: isBlack()的类派生时,我就是这样,那个isBlack就变成了一个有效的虚函数。
答案 0 :(得分:3)
这是一个"工作"实施,但我强烈建议不要这样做:
class Animal {
public:
virtual bool isBlack() = 0;
}
class BlackAnimal : public virtual Animal {
public:
virtual bool isBlack() {return true;}
}
class BigCat : public virtual Animal {}
class Jaguar : public BigCat, public BlackAnimal { }
您可能希望阅读https://isocpp.org/wiki/faq/multiple-inheritance以获取C ++中多重继承的概述,特别是https://isocpp.org/wiki/faq/multiple-inheritance#mi-diamond关于虚拟继承的本节。
这里广泛存在的问题是你的美洲虎类有两个isBlack()函数 - 一个来自动物,一个来自blackAnimal。使用虚拟继承只会导致“动物”的一个实例。基类,如果你设置正确的话,blackAnimal的isBlack()优先。
(我假设您希望isBlack()是虚拟的并且在写出您的示例时犯了一个错误,并且您还意识到具有虚函数的类应该具有虚拟析构函数。)