从继承的虚基定义纯虚函数 类
Defining pure virtual functions from inherited virtual base classes
假设我有一个带有虚拟方法的 class 和两个以不同方式定义该方法的派生 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 派生出另一个 class,并创建两个新的子类型:
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() 的 class 派生时,我希望 isBlack 成为一个有效的虚函数。
这是一个 "working" 实现,但我强烈建议不要这样做:
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 for an overview of multiple inheritance in C++ and this section in particular https://isocpp.org/wiki/faq/multiple-inheritance#mi-diamond 关于虚拟继承的内容。
这里的问题大体上是您的 jaguar class 有两个 isBlack() 函数 - 一个来自 animal,一个来自 blackAnimal。使用虚拟继承只会导致 'animal' 基础 class 的一个实例,如果设置正确,blackAnimal 的 isBlack() 会优先。
(我假设您希望 isBlack() 是虚拟的并且在编写您的示例时犯了一个错误,而且您知道 class 具有虚函数的 es 应该具有虚析构函数) .
假设我有一个带有虚拟方法的 class 和两个以不同方式定义该方法的派生 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 派生出另一个 class,并创建两个新的子类型:
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() 的 class 派生时,我希望 isBlack 成为一个有效的虚函数。
这是一个 "working" 实现,但我强烈建议不要这样做:
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 for an overview of multiple inheritance in C++ and this section in particular https://isocpp.org/wiki/faq/multiple-inheritance#mi-diamond 关于虚拟继承的内容。
这里的问题大体上是您的 jaguar class 有两个 isBlack() 函数 - 一个来自 animal,一个来自 blackAnimal。使用虚拟继承只会导致 'animal' 基础 class 的一个实例,如果设置正确,blackAnimal 的 isBlack() 会优先。
(我假设您希望 isBlack() 是虚拟的并且在编写您的示例时犯了一个错误,而且您知道 class 具有虚函数的 es 应该具有虚析构函数) .