继承与纯虚函数混为一谈,有什么办法不必重新定义它们?
Inheritance mess with pure virtual functions, any way to not have to re-define them all?
所以我发现自己在 class 层次结构中有点混乱。
我的代码看起来有点像那样,过于简单化了:
#include <iostream>
struct Parent {
virtual void pureVirtual() = 0;
};
struct Child : public Parent {
void pureVirtual() override {
std::cout << "Child::pureVirtual()" << std::endl;
}
};
struct Brother: public Parent {
};
struct GrandChild : public Child, public Brother {
};
GrandChild test;
编译失败:
object of abstract class type "GrandChild" is not allowed: -- pure virtual function
"Parent::pureVirtual" has no overriderC/C++(322)
我不完全理解为什么 pureVirtual
的实现没有被 GrandChild
从 Child
继承。
在实践中,我有大量的纯虚函数要“重新实现”,也就是说,只需编写如下行:
struct GrandChild : public Child, public Brother {
void pureVirtual() override {
Child::pureVirtual();
}
};
我本以为编译器会自动使用 Child
的实现。
有什么技巧可以告诉编译器我要重用 Child
中的所有实现吗?
无论如何,我可能不得不考虑更好的设计,但如果有简单的解决方案,这让我很感兴趣。
问题是您实际上 得到两个 pureVirtual
函数。默认情况下,C++ 不够聪明,无法合并两者。您可以使用 virtual inheritance 来强制执行此行为。
#include <iostream>
struct Parent {
virtual void pureVirtual() = 0;
};
struct Child : virtual public Parent {
void pureVirtual() override {
std::cout << "Child::pureVirtual()" << std::endl;
}
};
struct Brother : virtual public Parent {};
struct GrandChild : public Child, public Brother {};
int main() {
GrandChild test;
}
I don't fully understand why the implementation of pureVirtual
is not inherited by GrandChild
from Child
.
实际上,GrandChild
确实继承了 Child
中 pureVirtual()
的 override
实现。
但是,GrandChild
也从 Brother
继承了 pureVirtual()
。 Brother
是抽象的,因为它没有 override
它的 pureVirtual()
版本,因此 GrandChild
也是抽象的,除非它为 Brother::pureVirtual()
提供了 override
作为嗯。
您拥有经典的钻石层次结构。需要使用虚继承来解决
How does virtual inheritance solve the "diamond" (multiple inheritance) ambiguity?
所以我发现自己在 class 层次结构中有点混乱。
我的代码看起来有点像那样,过于简单化了:
#include <iostream>
struct Parent {
virtual void pureVirtual() = 0;
};
struct Child : public Parent {
void pureVirtual() override {
std::cout << "Child::pureVirtual()" << std::endl;
}
};
struct Brother: public Parent {
};
struct GrandChild : public Child, public Brother {
};
GrandChild test;
编译失败:
object of abstract class type "GrandChild" is not allowed: -- pure virtual function "Parent::pureVirtual" has no overriderC/C++(322)
我不完全理解为什么 pureVirtual
的实现没有被 GrandChild
从 Child
继承。
在实践中,我有大量的纯虚函数要“重新实现”,也就是说,只需编写如下行:
struct GrandChild : public Child, public Brother {
void pureVirtual() override {
Child::pureVirtual();
}
};
我本以为编译器会自动使用 Child
的实现。
有什么技巧可以告诉编译器我要重用 Child
中的所有实现吗?
无论如何,我可能不得不考虑更好的设计,但如果有简单的解决方案,这让我很感兴趣。
问题是您实际上 得到两个 pureVirtual
函数。默认情况下,C++ 不够聪明,无法合并两者。您可以使用 virtual inheritance 来强制执行此行为。
#include <iostream>
struct Parent {
virtual void pureVirtual() = 0;
};
struct Child : virtual public Parent {
void pureVirtual() override {
std::cout << "Child::pureVirtual()" << std::endl;
}
};
struct Brother : virtual public Parent {};
struct GrandChild : public Child, public Brother {};
int main() {
GrandChild test;
}
I don't fully understand why the implementation of
pureVirtual
is not inherited byGrandChild
fromChild
.
实际上,GrandChild
确实继承了 Child
中 pureVirtual()
的 override
实现。
但是,GrandChild
也从 Brother
继承了 pureVirtual()
。 Brother
是抽象的,因为它没有 override
它的 pureVirtual()
版本,因此 GrandChild
也是抽象的,除非它为 Brother::pureVirtual()
提供了 override
作为嗯。
您拥有经典的钻石层次结构。需要使用虚继承来解决
How does virtual inheritance solve the "diamond" (multiple inheritance) ambiguity?