c++中的虚基类
Virtual Base Class in C++
我有一个关于虚拟基类的查询。为了解决多重继承中"可怕的死亡之钻"/歧义问题,引入了虚拟基类。
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
class C
声明中没有使用关键字virtual
会发生什么?你能给我详细解释一下吗?
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};
如果继承的不是virtual
,那么A
成员将在D
类中出现两次。
如果A
有一个名为_a
的字段,那么在D
中,写B::_a
或C::_a
将引用两个不同的内存区域。如果你的继承是virtual
,那么你只有一个内存区。
如果您使用的是virtual,那么当您使用Class D
的实例调用foo()
时就不会有歧义。如果你不使用虚拟,那就会模棱两可。但是要注意,虚拟继承的成本更高,所以要谨慎使用。
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};
如果从A类到B的继承标记为虚,而不是A类到C的继承,那么c++将创建一个虚A (D继承B, B继承A)和一个非虚A (D继承C, C继承A)。因此,您的代码将无法解决钻石问题:
D d_object;
A &a_ref = d_object; // error raised -> B::A or C::A
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 模板基类中的静态变量
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 继承和友元函数,从基类访问受保护的成员