理解 C 中的虚拟继承
在处理复杂的继承层次结构时,C 提供虚拟继承作为解决菱形问题的机制,以下情况派生类通过多个路径从同一基类继承。但是,使用虚拟继承有时会导致意外的编译错误。
请考虑以下代码片段:
class Base { public: Base(Base* pParent); /* implements basic stuff */ }; class A : virtual public Base { public: A(A* pParent) : Base(pParent) {} /* ... */ }; class B : virtual public Base { public: B(B* pParent) : Base(pParent) {} /* ... */ }; class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here /* ... */ };
编译此代码时,GCC 在指示的行报告错误。该错误源于类 C 没有为 Base 提供初始化。虚拟基类仅由它们可见的最远派生类初始化。在本例中,这将是类 C。
在初始化期间不会调用 Base 的默认构造函数,因为虚拟基类永远不会直接继承。它必须通过初始化列表或通过将其分配给相同或派生类型的另一个对象来初始化。在这种情况下,类 C 没有为 Base 指定初始化,从而导致编译错误。
要解决此问题,应修改代码以在类 C 的构造函数中包含对 Base 的显式初始化。可以通过将 C 构造函数替换为以下内容来实现:
class C : public A, public B { public: C(C* pParent) : Base(pParent), A(pParent), B(pParent) {} // - Correct initialization here /* ... */ };
通过在类 C 的构造函数中显式初始化 Base,编译器现在可以正确处理虚拟继承并成功编译代码。
以上是C 中的虚拟继承如何处理钻石问题中的基类初始化?的详细内容。更多信息请关注PHP中文网其他相关文章!