gpt4 book ai didi

c++ - 虚函数歧义求解

转载 作者:行者123 更新时间:2023-11-27 23:03:56 25 4
gpt4 key购买 nike

所以在这里我得到了一个下降解释,什么是真正的虚函数以及为什么我们真的需要它,

In C++, what is a virtual base class?

但我心中仍然存在一个问题,即编译器实际上如何解释在多重或混合继承的情况下应该使用哪个定义。例如考虑这个例子

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_1Middle_2 类中使用 virtual 标签,这将消除歧义(因为编译器将只采用一个定义) 这就是我的问题出现的地方。

其实我有很多问题,

  • 编译器将如何选择最适合的类?

  • 选择是否在所有条件下都相似?

  • 这不是与编译器智商为零的事实相矛盾吗?

提前致谢。

最佳答案

整个程序中只有一个Up。无需选择任何内容。

也许您想问编译器将如何选择最适合的 Up 子对象表面上有一个 Up每个 Middle_1 对象中的子对象,以及每个 Middle_2 子对象中的 Up 子对象。编译器需要选择其中之一与 Down 一起使用,对吧?

错了。对于虚拟继承,子对象相对于它们的所有者来说并不是固定的。 Middle_1Middle_2 都不会创建自己的 Up 子对象,并且它们事先不知道这些 Up 子对象所在的位置.他们只知道他们将拥有一个。 某人 必须将 Up 的实例交给他们。

所以编译器会做一些肮脏的把戏。它将为每个Down 对象创建一个单个 Up 子对象,然后告诉Middle_1 部分 Middle_2 部分 Down 部分是他们的 Up 子对象。因此,所有三个部分都将单个 Up 视为它们自己的,完全忘记了它实际上是共享的这一事实。

这个方案确实需要一些不平凡的智商才能发明,但每个愚蠢的编译器都有能力实现它。

关于c++ - 虚函数歧义求解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25040843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com