C++ FAQs 20.05:
"虚基类很特殊,它们的析构函数只会在最终派生类的析构函数中被调用。"
我不太理解这与“数据成员析构函数先于基类析构函数”规则之间的关系。
虚基类有何特别之处?我无法理解上述内容的含义 :s
"虚基类很特殊,它们的析构函数只会在最终派生类的析构函数中被调用。"
我不太理解这与“数据成员析构函数先于基类析构函数”规则之间的关系。
虚基类有何特别之处?我无法理解上述内容的含义 :s
struct B {};
struct M1 : B {};
struct M2 : B {};
struct D : M1, M2 {}
不存在虚继承。所有基类都使用常规继承方式继承。在这种情况下,类D
将包含两个独立的B
类型子对象:一个是由M1
带入的,另一个是由M2
带入的。
+-> D <-+
| |
M1 M2
^ ^
| |
B B <- there are two different `B`s in `D`
struct B {};
struct M1 : virtual B {};
struct M2 : virtual B {};
struct D : M1, M2 {}
现在只有一个类型为 B
的子对象在 D
中。 M1
和 M2
都可以看到并共享 相同的 类型为 B
的子对象作为它们的基础。
+-> D <-+
| |
M1 M2
^ ^
| |
+-- B --+ <- there is only one `B` in `D`
struct Base {};
struct D : virtual Base {};
struct D1 : D, virtual Base {};
struct D2 : virtual Base, D {};
Base Base
| \ | \
/_\ \ | /_\
| \ | \
D /_\ | D
| / | /
/_\ / /_\ /_\
| / | /
D1 D2