问题标签 [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 投票
11 回答
330640 浏览

c++ - 在 C++ 中,什么是虚拟基类?

我想知道什么是“虚拟基类”以及它的含义。

让我举个例子:

0 投票
5 回答
2698 浏览

c++ - C++ 多重虚拟继承与 COM

网上充斥着对“可怕的钻石问题”的解释。StackOverflow 也是如此。我想我理解这一点,但我未能将这些知识转化为理解相似但不同的东西。

我的问题从纯 C++ 问题开始,但答案很可能会扩展到 MS-COM 细节。一般问题的问题是:

不是经典的钻石解决方案。究竟“虚拟”在这里做什么?

我真正的问题是试图理解我们朋友在 CodeProject 的讨论。它涉及用于为 Flash 播放器创建透明容器的自定义类。

我想我会试试这个地方的乐趣。事实证明,以下声明使用 Flash 播放器版本 10 使您的应用程序崩溃。

调试表明,当输入来自不同调用者的函数实现(QueryInterface 等)时,我得到不同调用的不同“this”指针值。但是删除“虚拟”就可以了!没有崩溃,并且相同的“this”指针。

我想清楚地了解到底发生了什么。非常感谢。

干杯亚当

0 投票
1 回答
4120 浏览

c# - 未调用重写的虚函数

我的项目中有一个奇怪的问题。我有一个从基类继承的类(它又从另一个基类继承)并覆盖了一个函数。但是,当调用该函数时,它永远不会调用被覆盖的函数,而是调用基函数。

但是,当我在中间类中覆盖该函数时,它会被调用。但这很令人困惑:让我们用一张图来解释:)

  • lib GuiShared

    • b级屏幕
      • 虚函数 InitializeRoc
  • 库 TigerControlRoot

    • bTigerScreen 类
      • 覆盖函数 InitializeRoc <-- 当在这里被覆盖时,它被调用
  • lib TigerControlRootCommonScreens
    • 类 CheckInRules
      • 覆盖函数 InitializeRoc <-- 未调用:s

然而,构造函数被调用......

这是我的(简化的)代码:

共享基类

项目基类

失败的类(或该库中的任何其他类)

如果这还不够,当我尝试调用基类上的某个函数时,我会收到 TypeLoadException。

在另一个项目中使用了具有相同 GuiShared 库的类似代码,没有问题。

0 投票
4 回答
1125 浏览

c++ - 不同编译器的 C++ 虚拟继承实现是否不兼容?

我有这样的公共接口层次结构:

实现 IFooBar 的类与工厂函数一起放入 dll 中。客户端代码加载 dll,使用工厂函数创建类实例并根据接口使用它(它们作为头文件提供)。

Scheme 适用于 MSVC 制作的 dll 和 Borland C++ Builder 6 制作的客户端代码。

我将虚拟继承引入层次结构:

当在相同的情况下(MSVC 的 dll,Builder 的客户端)客户端代码请求类的实例时,他用凌乱的 vtable 得到它。

除了回滚到普通继承之外,还有其他解决方案吗?

0 投票
2 回答
454 浏览

c++ - C ++中的非对称虚拟继承菱形

所以我有这个想法,我认为用C++实现基本上是不可能的......但我想问一下。我通读了 Stroustrup 的第 15 章并没有得到我的答案,而且我认为关于继承钻石的其他十亿个问题也无法回答这个问题,所以我在这里问。

问题是,当您从两个共享一个公共基类的基类继承时会发生什么,但是这两个基类中只有一个虚拟继承自它。例如:

我想我想这样做的原因是因为我正在尝试扩展现有库而不必重新编译整个库(不想打开那个蠕虫罐)。已经存在我想要修改的继承链。基本上是这样的(请原谅 ascii 艺术)

得到图片?我希望每个“ My”类的对象成为它们本质上要替换的类的对象,但我希望继承图中的下一个类使用“ My”基类中的重写方法实现,但所有其他方法都来自图书馆的课程。库类实际上不会继承,所以就像这样

但是如果我让我的班级几乎继承

既然MyDerived会有一个 vtable,并且MyBase会有一个 vtable,那么是否只有一个LibBase对象?

我希望这个问题足够清楚。

0 投票
4 回答
10019 浏览

c++ - 虚函数和多继承情况下的对象布局

我最近在一次采访中被问及涉及虚拟功能和多重继承的对象布局。
我在上下文中解释了它是如何在不涉及多重继承的情况下实现的(即编译器如何生成虚拟表,在每个对象中插入指向虚拟表的秘密指针等等)。
在我看来,我的解释中缺少一些东西。
所以这里有问题(见下面的例子)

  1. C类对象的确切内存布局是什么。
  2. C 类的虚拟表条目。
  3. A、B 和 C 类对象的大小(由 sizeof 返回)。(8、8、16 ??)
  4. 如果使用虚拟继承会怎样。肯定会影响大小和虚拟表条目吗?

示例代码:

谢谢!

0 投票
7 回答
18522 浏览

c++ - C ++中的最终类

上面的代码试图实现不可继承的类(final)。但是使用上面的代码仍然可以创建派生对象,为什么?

仅当 ctor 设为私有时才能实现所需的功能,我的问题是为什么在 dtor 私有的情况下无法实现?

0 投票
4 回答
138 浏览

c++ - 实现中未见的虚拟方法

我目前正在做一个 C++ 项目,我有一个稍后实现的抽象接口。该接口还有一个已实现的方法,我的实现不会覆盖该方法。我的问题是,在使用我的实现时,编译器(MSVC)看不到接口方法。是什么原因造成的,我该如何解决?

代码来了。

0 投票
2 回答
935 浏览

c++ - 虚拟继承 - gcc 与 vc++

我对 Visual Studio 2008 有一个关于虚拟继承的问题。

考虑以下示例:

如果我在我的 linux 机器上使用 gcc,这段代码编译得很好。但是,如果我尝试使用 Visual Studio 在 Windows 上构建相同的内容,则编译失败并显示错误消息“错误 C2614:'B':非法成员初始化:'Print' 不是基础或成员。”

为什么这不起作用?

0 投票
3 回答
4456 浏览

c++ - C++ 虚拟继承

问题:

在给定的位置,gcc 抱怨它无法匹配对 Base() 的函数调用,即默认构造函数。但是C不直接从Base继承,只通过A和B。那么为什么gcc在这里抱怨呢?

想法?TIA /罗伯