gpt4 book ai didi

c++ - 类中 'virtual' 的含义

转载 作者:行者123 更新时间:2023-11-30 03:04:20 24 4
gpt4 key购买 nike

在下面的例子中,virtual 被用来解决菱形继承(钻石问题),让类 A 的子对象与 B 和 C 共享。

例如:

class A { };
class B : virtual public A { };
class C : virtual public A { };
class D : public B, public C { };

这种类型的继承是在编译时还是运行时解决?我的意思是,virtual 用于函数和类时的含义有何不同?用virtual继承基类有动态绑定(bind)的概念吗?

最佳答案

继承不必像您所说的那样“解决”,所以问题不是很清楚。

重要的区别在于普通继承和虚继承。如果您是普通继承,即 B : A , C : A , 然后是类 D : B, C两个类型的子类A , 即 D::B::AD::C::A .另一方面,如果 BCA 继承虚拟 ,那么最终的子类组合将被推迟,直到你定义最终类型。即 B : virtual AC : virtual A他们自己都有一个虚拟子类A如果你要实例化 B 这将成为现实或 C .另一方面,如果您进一步从类派生,那么最派生的类将只包含 一个 类型为 A 的子类。 .

也许您可能喜欢考虑与成员函数 的类比。如果每个派生类都添加一个与基函数同名的成员函数,那么您最终会得到几个不同的函数。另一方面,如果基函数是 virtual ,那么你只有 一个 函数,它是在最派生的类中定义的。您在每个中间类中仍有一些函数(假设该函数不是纯虚拟的),但只有最终类定义了“事件”定义。

虚继承对构造函数有影响,即虚基构造函数(即示例中的A())由最派生类直接调用,即D。 , 而不是 BC .如果你愿意,这是因为只有 D “知道”它只包含一个 A -子类,所以它直接对它“负责”。 BC只需保留一个虚拟占位符,让位给最终的、最派生的类。

通过任何基指针/引用访问成员函数的行为与预期的一样,并以通常的方式解析(即动态地,通常),但这与虚拟继承无关。实际的函数查找可能会稍微复杂一些,因为它可能涉及额外的间接级别,但这不会改变任何基本内容。

关于c++ - 类中 'virtual' 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8693742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com