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

c++ - C ++多重继承防止钻石

有没有办法在 C++ 中定义一个类 Foo 以便

  1. 我可以继承它
  2. 我不能从中“继承钻石”

IE

0 投票
3 回答
3986 浏览

c++ - C++私有虚拟继承问题

在下面的代码中,C 类似乎无法访问 A 的构造函数,这是由于虚拟继承所必需的。然而,代码仍然可以编译和运行。为什么它有效?

此外,如果我从 A 中删除默认构造函数,例如

然后

会(出乎意料地)编译,但是

不会像预期的那样编译。

使用“g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)”编译的代码,但已验证它与其他编译器的行为相同。

0 投票
3 回答
12023 浏览

c++ - 纯虚拟类和集合(向量?)

我正在开发一个相当广泛地使用虚拟类的图形应用程序。它有:

  • 图片类,本质上是形状的集合。

  • 一个 shape 类,它是纯虚拟的,并且有几个继承自它的类:

    • 圆圈
    • 多边形
    • 长方形
  • 图形形状,它是任何图形图形(也是虚拟的),形状继承自此。

本质上,我的问题归结为实现图片类,它基本上用于存储形状的集合。我目前正在使用 Vector 来存储形状,但是,很明显这是错误的决定,因为 Vector 实例化了这些形状,这并不好,因为它们是纯虚拟的。

以下是我当前的代码库(总结了一下):

我收到的错误消息只是其中的一堆:

picture.cpp:33:从这里实例化 /opt/local/bin/../lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++ /4.4.1/ext/new_allocator.h:105:错误:无法分配抽象类型“Shape”shape.h:12的对象:注意:因为以下虚函数在“Shape”中是纯的:shape.h:58 : 注意: 虚拟 void Shape::get(std::istream&) shape.h:31: 注意: 虚拟 void Shape::put(std::ostream&) const shape.h:36: 注意: 虚拟 void Shape::scale (const Point&, double) shape.h:40: note: virtual void Shape::translate(double, double) shape.h:45: note: virtual void Shape::reflectHorizo​​ntally(double) shape.h:49: note: virtual void Shape::reflectVertically(double) shape.h:52: 注意:virtual RectangularArea Shape::boundingBox() const shape。h:21: note: virtual Shape* Shape::clone() const shape.h:55: note: virtual void Shape::draw(Graphics&) const

那么存储这些形状的理想方法是什么。我应该使用什么样的收藏品来存储这些东西?

谢谢

0 投票
3 回答
415 浏览

c++ - Virtual Inheritance:Base Ctor 没有在最派生类中调用?

在上述情况下, forZ():X(10){} Base(int k):a(k)不是调用,而是当我更改Z():Base(10){}Base(int k):a(k)调用时。为什么 ?

谢谢你。

0 投票
5 回答
89460 浏览

c++ - 虚拟继承如何解决“钻石”(多重继承)的歧义?

我了解钻石问题,上面的代码没有这个问题。

虚拟继承究竟是如何解决这个问题的?

我的理解: 当我说A *a = new D();时,编译器想知道一个类型的对象是否D可以分配给一个类型的指针A,但是它有两条路径可以遵循,但不能自行决定。

那么,虚拟继承如何解决这个问题(帮助编译器做出决定)?

0 投票
5 回答
854 浏览

c++ - 关于虚拟继承层次结构的问题

我在处理虚拟继承时遇到了这个问题。我记得在非虚拟继承层次结构中,子类的对象持有其直接超类的对象。虚拟继承呢?在这种情况下,子类的对象是直接持有其超类的对象,还是仅仅持有指向其超类对象的指针?

顺便说一下,为什么下面代码的输出是:

代码:

提前致谢。亲切的问候。

0 投票
7 回答
3754 浏览

c++ - 解决 C++ 中不明确的 this 指针

我正在尝试从旧类派生一个新类。基类声明如下所示:

它的构造函数如下所示:

因此,当我创建派生类时,我首先尝试简单地从基类继承:

并复制构造函数:

编译器(来自 Analog Devices 的 VisualDSP++ 5.0)不喜欢这样:

这是有道理的,所以我决定直接从 Plugin 和 CmdObject 继承。为了避免多重继承歧义问题(我想),我使用了虚拟继承:

但是随后,在 NewDriver 中实现虚拟方法时,我尝试调用采用 Plugin* 的 Mgr::RegisterPlugin 方法,结果如下:

this 指针如何模棱两可,我该如何解决?

谢谢,

——保罗

0 投票
4 回答
3246 浏览

c++ - 不能强制转换具有多重继承的类

我正在尝试重构一些代码,同时保留现有功能。我无法将指向对象的指针转换为基接口,然后再将派生类取出。在某些情况下,程序使用工厂对象来创建这些对象的实例。

以下是我正在使用的类的一些示例。

这个问题有关于不同类型的演员做什么的很好的信息,但它并没有帮助我弄清楚这种情况。使用 static_cast 和常规转换给我error C2594: 'static_cast': ambiguous conversions from 'MyObject *' to 'ISerializable *'. 使用 dynamic_cast 会导致 createObject() 返回 NULL。NormalObject 样式类和旧版本的 MyObject 与工厂中现有的 static_cast 一起工作。

有没有办法让这个演员工作?似乎应该是可能的。

0 投票
4 回答
5220 浏览

c++ - C++ 中的方法解析顺序

考虑以下类层次结构:

  • 具有虚方法 foo() 的基类 Object
  • 具有多重继承(虚拟和非虚拟)的任意层次结构;每个类都是 Object 的子类型;其中一些覆盖 foo(),一些没有
  • 此层次结构中的类 X,不覆盖 foo()

如何确定在 C++ 中对 X 类的对象调用 foo() 时将执行哪个方法?

(我正在寻找算法,而不是任何特定情况。)

0 投票
3 回答
12043 浏览

c++ - 用于多重虚拟继承和类型转换的虚拟表和虚拟指针

我对 vptr 和内存中对象的表示有点困惑,希望你能帮助我更好地理解这件事。

  1. 考虑B继承自A并且都定义虚函数f()。从我了解到的 B 类对象在内存中的表示形式如下所示:并且[ vptr | A | B ] 指向contains 。我也明白,将对象从to投射到除了忽略对象末尾的部分之外,什么也不做。这是真的吗?这种行为是不对的吗?我们希望该类型的对象执行method 而不是.vtblvptrB::f()BABAA::f()B::f()

  2. 系统中是否有一些vtables作为类的数量?

  3. vtable从两个或多个类继承的类的外观如何?C 的对象将如何在内存中表示?

  4. 与问题 3 相同,但具有虚拟继承。