问题标签 [virtual-inheritance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在 C++ 中,我应该几乎总是使用虚拟继承吗?
我从这个条目中看到,虚拟继承将 sizeof(pointer) 添加到对象的内存占用中。除此之外,默认情况下仅使用虚拟继承和仅在需要时使用常规继承对我有什么缺点吗?似乎它会导致更多面向未来的类设计,但也许我错过了一些陷阱。
c++ - C++ 中的同时私有和公共继承
假设一个类Y
公开继承一个类X
。一个类可以在公开继承的同时Z
私下继承吗?Y
X
为了更清楚地说明这一点,假设X
定义了公共方法x1
和x2
. Y
继承X
、覆盖x1
并提供方法y
。C++ 是否允许第三个类Z
以Y
这样的方式进行子类化,即它Y
的实现x1
和y
私有可用,而外部世界只看到它X
公开继承,即只有一个公共方法x2
?
c++ - 什么时候虚拟继承是一个好的设计?
EDIT3:请务必在回答之前清楚地理解我的要求(有EDIT2和很多评论)。有(或曾经)很多答案清楚地表明了对问题的误解(我知道这也是我的错,对此感到抱歉)
嗨,我已经查看了有关class B: public virtual A {...}
C++ 中虚拟继承 ( ) 的问题,但没有找到我的问题的答案。
我知道虚拟继承存在一些问题,但我想知道的是在哪些情况下虚拟继承会被认为是一个好的设计。
我看到人们提到类似IUnknown
or的接口ISerializable
,而且这种iostream
设计是基于虚拟继承的。这些是否是很好地使用虚拟继承的好例子,仅仅是因为没有更好的选择,还是因为在这种情况下虚拟继承是正确的设计?谢谢。
编辑:为了澄清,我问的是现实生活中的例子,请不要给出抽象的例子。我知道什么是虚拟继承以及哪种继承模式需要它,我想知道什么时候它是做事的好方法,而不仅仅是复杂继承的结果。
EDIT2:换句话说,我想知道菱形层次结构(这是虚拟继承的原因)何时是一个好的设计
c++ - C++中的嵌套继承
我对 C++ 中的嵌套继承有疑问。我有三个类Base
:Middle
和Top
。通常我在派生时使用公共继承Middle
,但是我有一个类(Top
)私有地继承自Middle
,但是它应该公开Base
方法以供公共使用......
这是我的解决方案,可以吗?
c++ - 虚拟继承的性能影响
我正在考虑在实时应用程序中使用虚拟继承。使用虚拟继承是否会产生类似于调用虚拟函数的性能影响?有问题的对象只会在启动时创建,但我担心层次结构中的所有函数都将通过 vtable 调度,或者只有来自虚拟基类的函数才会调度。
c++ - 关于 C++ 中的虚拟基类和虚拟继承
可能重复:
gcc c++ 虚拟继承问题
大家好,我正在阅读 Scott myers 的《Effective C++》。下面提到了虚拟基类和虚拟继承。
管理虚拟基类初始化的规则比非虚拟基类的规则更复杂,也更不直观。初始化虚拟基的责任由层次结构中最派生的类承担。当一个新的派生类被添加到层次结构中时,它必须为其虚拟基础(直接和间接)承担初始化责任
问题在上面的陈述中,虚拟基类的初始化规则是什么,派生类必须承担什么责任,如上文所述。请要求举例说明。
谢谢!
c++ - 派生类中方法的调用列表
我正在开发一个测试框架。有许多测试套件,每个测试套件都是一个类,每个测试套件都有一组成员函数。
我想找到一种方法来动态迭代一个类中的所有测试。
理想化的设置可能如下所示:
addTest() 方法会将其参数添加到列表中;稍后会迭代此列表并运行每个方法。
有什么办法可以做到这一点?到目前为止,我们提出的最接近的是:
要在主运行循环的每次迭代中调用一个测试:
这并不理想,因为每个测试套件(类)都必须重复 run() 代码并拥有自己的 mTests 成员。
有没有办法更接近理想?
c++ - 为什么需要在菱形层次结构中间指定虚拟继承?
我有钻石类的层次结构:
为了避免 A 在 D 中的两个副本,我们需要在 B 和 C 处使用虚拟继承。
问题:为什么虚拟继承需要在 B 和 C 执行,即使歧义在 D?如果它在 D 处会更直观。
为什么标准委员会会这样设计这个功能?如果 B 和 C 类来自 3rd 方库,我们该怎么办?
编辑:我的回答是指示 B 和 C 类,它们不应在创建派生对象时调用 A 的构造函数,因为它将由 D 调用。
c++ - C++中的虚拟继承
我在阅读 C++ 中的虚拟继承时在一个网站上找到了这个
使用多重继承时,有时需要使用虚拟继承。一个很好的例子是标准 iostream 类层次结构:
C++ 如何确保只存在一个虚拟成员的单个实例,而不考虑从它派生的类的数量?C++ 使用额外的间接级别来访问虚拟类,通常是通过指针。换句话说,iostream 层次结构中的每个对象都有一个指向 ios 对象共享实例的指针。额外的间接级别有轻微的性能开销,但这是一个很小的代价。
我对以下声明感到困惑:
C++ 使用额外的间接级别来访问虚拟类,通常通过指针
有人可以解释一下吗?