问题标签 [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 回答
7918 浏览

c++ - 是否需要从纯抽象类(接口)进行虚拟继承

为什么在下面的代码中编译器抱怨这PureAbstractBase是一个模棱两可的基类MultiplyInheritedClassPureAbstractBase我意识到我有两个inMultiplyInheritedClass和 that的副本,FirstConreteClass并且SecondConreteClass应该虚拟派生,因为它们是菱形的中间行(这确实解决了下面代码的问题)。但是,即使我有两个接口副本,为什么其中的代码MultiplyInheritedClass不只是覆盖两者并明确选择定义的接口类MultiplyInheritedClass

此外,为什么我对以下层次结构没有问题?在这种情况下,ConcreteHandler 类没有 AbstractTaggingInterface 的三个副本吗?那么为什么它没有与上面的示例相同的问题呢?

我正试图将所有这些都包裹起来,因为我最近与一位同事进行了交谈,他声称如果您从没有任何数据成员的纯虚拟类(接口)继承,则不需要虚拟继承。我认为理解为什么前一个代码示例不起作用而后者确实会在我脑海中直截了当(并​​弄清楚他的评论到底是什么意思)。提前致谢。

0 投票
2 回答
340 浏览

c++ - 虚继承和虚函数使用同一个vtable吗?

有一个相关的小问题。但主题完全不同。

现在,一个概念是关于函数解析,另一个是关于class解析?我想知道如果他们使用相同的vtable至少在 gcc-4.5 中)怎么可能?这是一个依赖于编译器的术语吗?

我知道这可能看起来像一个基本的愚蠢问题,但我从来没有想过它。

0 投票
1 回答
55 浏览

oop - 没有代码的第一个非抽象虚拟方法的特殊名称?

这个问题来自另一个类似的问题。有时我不得不处理这种情况。

您是否知道面向对象编程中是否存在一个特殊名称,对于已声明的初始方法virtual,即故意 abstract,但是,什么都不做,或者根本没有任何代码,但是,可能被调用?

此示例是伪代码,但适用于任何 OO 编程语言:

方法MyBaseClass::MayDoSomething()就是这样。

干杯。

0 投票
2 回答
1493 浏览

c++ - 在父函数中调用覆盖的子函数

是否可以在 C++ 中从父函数调用子函数。

举个例子:父类在函数中定义(解析)一般工作流程。然后,工作流调用代表流的一部分的不同方法 (parseElementA)。这些函数可以被子类覆盖,如果不是标准函数,它是父类的一部分。

我的问题是:我创建了一个子对象并执行工作流函数(解析)。当在工作流函数中调用被覆盖的函数 (parseElementA) 时,它会从父函数而不是子函数调用该函数。我该怎么做,它会调用 child 中的覆盖函数。

输出是父级。我能做些什么让它返回孩子。

非常感谢您的任何建议。

0 投票
3 回答
410 浏览

c++ - 为什么单一虚拟继承不足以解决可怕的钻石问题?

在上面编码之后,编译器仍然D2要求virtual

我不明白的是,一旦您提示了与(via ) 相关的编译B器,那么为什么它仍然是模棱两可的?virtualDDD1i

(如果我没记错的话,较旧的 VC++(2006 年)足以通过单virtual继承来解决这个问题)

0 投票
1 回答
17540 浏览

c++ - 通过优势警告进行 C++ 继承

我正在尝试实现一个实现许多接口的相当大的对象。其中一些接口是纯虚拟的。我可能在钻石继承上有问题。Visual Studio 报告C4250 ('class1' : inherits 'class2::member' via dominance). 首先,这些类实际上是按应有的方式继承的。以下是导致此问题的部分类设计。

在这整个树中,只有 D 实现了虚拟方法,没有其他方法定义问题。B 的所有虚方法都列在警告中。如果重要,D 是一个完整的类。

我读到 Boost 序列化会发生这种情况,忽略警告是安全的。

我试图实现的这种方法有效吗?忽略此警告是否安全?

注意 1:这不是Visual Studio 编译器警告 C4250 ('class1' : inherits 'class2::member' via dominance)的副本,我已经尝试了那里提出的解决方案。

注2:我也可以发送类图,但它比这复杂一点。

编辑: 完整警告如下:

gge::resource::ImageResource图中是 Big,gge::graphics::ImageTexture是 D,drawin 是我收到警告的六种方法之一。

0 投票
1 回答
1309 浏览

c++ - C ++,vs 2010中的模棱两可的继承错误

我在这个例子中应用多态性有一些麻烦。这个问题和我上一个问题类似

C++,虚拟继承,奇怪的抽象类+克隆问题

有3个抽象类:

和两个使用虚拟继承的继承类

上述错误仅在使用 MSVS 2010 编译器时发生,g++ 编译此代码 OK。

类图(简化)

最后一次讨论我们以结果结束:从类 C 中删除 copy() 方法的声明。

我使用多态的示例代码需要创建指向 C 的指针向量。删除一些元素后,我想创建它的副本...我需要在 C 类中声明 copy(),因此删除声明是不够的,它不会解决这个问题。

您能帮我吗,请如何更正代码以使用 VS 2010 进行翻译?

0 投票
1 回答
1213 浏览

c++ - 虚拟继承中的优势

C++98/C++03 标准和 C++0x 未来标准在虚拟继承中占主导地位的确切规则是什么?

我不只是要求特定的段落,尽管我也在要求(我猜在第 10 节的某个地方)。

我也在询问标准语言的后果,标准语言解释得很清楚。

0 投票
2 回答
2071 浏览

c++ - 多重(菱形)继承在没有“虚拟”的情况下编译,但没有

给定以下代码(没有虚拟继承):

代码编译。

另一方面,这里:

编译器出现编译错误:

为什么第二个代码不同?

0 投票
5 回答
484 浏览

c++ - 虚拟继承(菱形) - 为什么我需要从最派生类向上转换到基类

考虑以下 :

如您所见,我在class CC的实现中添加了Ctor(构造函数)。我不清楚的是,如果 B1 在其 Ctor 中为我完成这项工作,为什么我还需要从 C 到 A 的向上转换?意思是,如果我将 C 的 Ctor 写为:

为什么我不能写:

谢谢,罗南