从继承的虚拟基类定义纯虚拟函数
Defining pure virtual functions from inherited virtual base classes
假设我有一个带有虚拟方法的类和两个派生类,它们以不同的方式定义该方法:
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 {};
我该怎么做。当我这样做时,animal的isBlack()方法保持虚拟。我希望当我从定义animal::isBlack()的类派生时,isBlack变成一个工作的虚拟函数。
这是一个"有效"的实现,但我强烈建议不要这样做:
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-关于虚拟继承的钻石。
大体上,这里的问题是jaguar类有两个isBlack()函数——一个来自animal,另一个来自blackAnimal。使用虚拟继承只会导致"animal"基类的一个实例,如果设置正确,则blackAnimal的isBlack()将优先。
(我假设您希望isBlack()是虚拟的,并且在编写示例时犯了一个错误,而且您知道具有虚拟函数的类应该具有虚拟析构函数)。
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数