【发布时间】:2014-07-30 15:28:24
【问题描述】:
所以在这里我得到了一个下降解释,什么是虚函数以及为什么我们真的需要它,
但在我的脑海中仍然存在一个问题,即编译器如何实际解释在多重继承或混合继承的情况下应该使用哪个定义。例如考虑这个例子
class Up {
public:
void func(){
...
}
};
class Middle_1 : public virtual Up {
public:
...
};
class Middle_2 : public virtual Up {
public:
...
};
class Down : public Middle_1, public Middle_2 {
public:
...
};
在上面的示例代码中,Down 类接收到Up 类的两个定义(即一个来自Middle_1,另一个来自Middle_2)。但是,我们确保在 Middle_1 和 Middle_2 类中使用 virtual 标记,这将消除歧义的情况(因为编译器只会采用一个定义),这就是我的问题所在。
其实我有很多问题,
编译器将如何选择最适合的类?
选择是否在所有条件下都相似?
编译器的智商为零,这不矛盾吗?
提前致谢。
【问题讨论】:
-
类
Down在内存中的结构如下:{Up}{Middle_1}{Middle_2}{Down}。编译器必须继承自这两个类,因此没有“最适合的类”(我认为这里有些混乱)。选择通常基于您指定继承的顺序,但这可能是实现定义的。编译器智商? -
编译器的智商为零。编写它们的人通常智商很高。
-
@Aggieboy:
Down的确切结构布局是实现定义的; C++ 标准没有规定如何实现虚拟基类。我不确定我是否见过编译器用于虚拟继承的特定布局,但我肯定见过{{P}Middle_1}{{P}Middle_2}{Down}{Up}布局,其中{P}是指向Up虚拟基类实例的指针. -
@AdamRosenfield 我相信它必须在连续的内存中(否则放置 new 将不起作用),即使排序等是实现定义的。我说的主要是
g++的作用,但我会检查一下。 -
我只是 C++ 的初学者,只是陷入了这个疑问。我真的不知道这个问题是否真的很愚蠢,但老实说,这是我真正的好奇心。并感谢您重新提出我的问题!有人真的试图理解我的问题,真是太好了。