问题标签 [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.

0 投票
4 回答
1606 浏览

c++ - 菱形多态继承:sizeof 大部分派生类

我知道菱形继承会导致歧义,可以通过使用继承来避免virtual Base Classes,问题不在于它。当类是多态的时,问题是关于菱形层次结构中最派生类的大小。这是示例代码和示例输出:

我得到的输出是:

据我了解Base,它包含一个虚拟成员函数,因此
在此环境中 sizeof Base = vptr 的大小 = 4

类似的是案例Derived1Derived2课程。

这是我与上述场景相关的问题:类对象
的大小如何Derived3,这是否意味着 Derived3 类有 2 个 vptr?
该类如何Derived3与这 2 个 vptr 一起工作,关于它使用的机制有什么想法吗?
类的大小保留为编译器的实现细节而不由标准定义(因为虚拟机制本身是编译器的实现细节)?

0 投票
7 回答
4641 浏览

c++ - 调用非虚拟基方法时,C++ 中的虚拟继承是否有任何惩罚/成本?

当我们从其基类调用常规函数成员时,在 C++ 中使用虚拟继承是否会在编译代码中产生运行时损失?示例代码:

0 投票
5 回答
6524 浏览

c++ - 了解多重继承中的vptr?

我试图理解书中有效 C++ 中的陈述。下面是多重继承的继承图。

在此处输入图像描述

在此处输入图像描述

现在这本书说 vptr 需要每个类中的单独内存。它还做出以下声明

上图中的一个奇怪之处在于,即使涉及四个类,也只有三个 vptr。实现可以随意生成四个 vptr,但三个就足够了(事实证明 B 和 D 可以共享一个 vptr),并且大多数实现都利用这个机会来减少编译器生成的开销。

我看不出为什么在每个类中都需要单独的内存用于 vptr。我知道 vptr 是从基类继承的,无论继承类型是什么。如果我们假设它显示了继承的 vptr 的结果内存结构,他们怎么能做出这样的声明

B和D可以共享一个vptr

有人可以澄清一下多重继承中的 vptr 吗?

  • 我们需要在每个类中单独的 vptr 吗?
  • 另外,如果上述情况属实,为什么 B 和 D 可以共享 vptr ?
0 投票
5 回答
2216 浏览

c++ - 异常需要虚拟继承吗?

我理解在使用多重继承时需要虚拟继承——它解决了可怕的钻石问题。

但是如果我不使用多重继承呢? 是否需要虚拟继承?

我似乎记得听说过它对异常很重要(抛出派生类,通过基类引用捕获)。但是虚拟析构函数不应该足够吗?

我已经尝试搜索我曾经在此看到的参考页面,但我似乎无法找到它。

0 投票
2 回答
2076 浏览

c++ - 钻石层次结构中的低落

为什么static_cast不能从虚拟基地垂头丧气?

g++ 4.5 说:

解决方案是使用dynamic_cast? 但为什么。什么是理性?

-- 编辑 --
下面很好的答案。没有答案详细说明子对象和 vtables 最终是如何被订购的。以下文章为 gcc 提供了一些很好的示例:
http ://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting

0 投票
0 回答
172 浏览

c++ - 具有虚拟基类的类的大小

可能重复:
对象大小与虚拟

为什么 sizeof(Class) 在我的 gcc 编译器上输出 12?有人可以解释一下吗?

0 投票
1 回答
212 浏览

.net - 如何合并(Winform)视觉继承树

我有 4 个 WinForm 应用程序。Form1从baseForm继承,Formv2从Formv1继承,v3从v2继承,v4从v3继承。大约有 2000 个控件分布在包含选项卡的许多选项卡中。

这真的会扼杀 Visual Studio 2008,经常导致它崩溃,而且总体上表现很糟糕。

我想创建一个仅从 baseForm 继承但包含 formsv1 到 v4 的所有可视布局(所有这些)的 FormV5,(baseForm 上没有控件)。

表单与表单的区别主要在于添加了新控件,一些旧控件必须移动或隐藏,或者一些标签在这里和那里更改。

谁能建议一种编程方式来做到这一点?就像在formV4上运行时使用反射或其他东西来生成代码(转储formV4控件、布局和属性)的某种方式一样,我可以剪切并粘贴到formV5.designer.vb.file中吗?

(注意,这是一个大约有 5 年历史的企业项目,每次我们进行更改时,我们都需要将其推送给我们所有的客户(医院)。我们没有自动化测试或单元测试,所以我需要得到这个正确的 :) )

谢谢乔纳森

合并所有实际的 formlogic 虚拟成员,应该可以手动管理。

0 投票
2 回答
138 浏览

c++ - 在未完成的类层次结构中对“最终”类使用虚拟继承

在未完成的类层次结构中抢先派生当前“位于底部”(即派生最多的)的虚拟类是否有任何危害或被认为是糟糕的设计?是否有充分的理由要等到真正需要虚拟继承(即,当有人决定扩展层次结构并产生菱形时)?

0 投票
2 回答
13065 浏览

c++ - 什么是班级的 VTT?

最近遇到了一个对我来说很新的 C++ 链接器错误。

我认识到了错误并解决了我的问题,但我仍然有一个烦人的问题:VTT 到底是什么?

旁白:对于那些感兴趣的人,当您忘记定义类中声明的第一个虚函数时,就会出现问题。vtable 进入类的第一个虚函数的编译单元。如果您忘记定义该函数,您会得到一个链接器错误,它无法找到 vtable,而不是对开发人员更友好的无法找到该函数。

0 投票
7 回答
9044 浏览

c++ - C++中的静态虚函数

我有一个基类和一个派生类,我想更改基函数,同时保持它们是静态的,因为它们应该作为静态传递给其他函数。

我怎样才能做到这一点?