gpt4 book ai didi

c++ - 具有多重继承的协变返回类型。这段代码是如何工作的?

转载 作者:可可西里 更新时间:2023-11-01 16:10:49 26 4
gpt4 key购买 nike

谁能告诉我返回类型协变在以下代码中是如何工作的?

class X
{
public:
int x;
};

class Y: public OtherClass, public X
{
};


static Y inst;

class A {
public:
virtual X* out() = 0;
};

class B : public A
{
public:
virtual Y* out()
{
return &inst;
}
};



void main()
{
B b;
A* a = &b;
//x and y have different addresses. how and when is this conversion done??
Y* y = b.out();
X* x = a->out();
}

编辑:对不起,我一定不够清楚。x 和 y 就像我期望的那样指向不同的地址,因为涉及多重继承,所以 X 和 Y 对象不在同一个地址上。我的问题是这个 Actor 什么时候完成?out() 函数无法做到这一点,因为从它的角度来看,它总是返回一个指向 Y 的指针。 out() 的调用者不可能这样做,因为它看到 X* 的具体类型可能是 X 或 Y。那么什么时候完成转换?

最佳答案

通过“它是如何工作的”,我猜你是在问生成的是什么代码看起来像。 (当然,在典型的实现中。我们都知道生成的代码在实现之间可能会有所不同。)我是知道两种可能的实现方式:

编译器总是生成代码返回一个指向基址的指针类(class);即在 B::out 中,编译器会将 Y* 转换为 X*在归还它之前。在调用站点,如果调用是通过具有静态类型 B 的左值,编译器将生成代码以将返回值重新转换为 Y*

或者(我认为这更频繁,但我离当然),编译器生成 thunk,所以当你调用 a->out 时,被调用的虚函数不是直接B::out,而是一个小的将从 B::out 返回的 Y* 转换为 X* 的包装器。

g++ 和 VC++ 似乎都使用了 thunk(快速浏览)。

关于c++ - 具有多重继承的协变返回类型。这段代码是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6856873/

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