gpt4 book ai didi

c++ - 当 auto 遇到多态和虚函数时,正确的行为是什么?

转载 作者:可可西里 更新时间:2023-11-01 18:18:23 29 4
gpt4 key购买 nike

class B {
public:
virtual void f(){
printf("B\n");
}
};
class D : public B {
public:
void f() {
printf("D\n");
}
};

int main(void)
{
B* d = new D();
d->f();
auto b = *d;
b.f();
}

对于d->f();,输出是D。这是正确的。但是对于 b.f();,输出是 B这样对吗?

最佳答案

Is this right?

没错,类型是在编译时推导的。 auto使用与 template argument deduction 相同的规则对于类型推导,基于静态类型,不考虑动态多态。

对于这种情况,d的类型是B*,那么*d的类型是B ,所以 b 的类型就是 B。然后 *d 将是 slicing copiedb,对于 b.f() B::f() 应该被调用。

代码等价于下面,可能更清晰。

B b = *d;
b.f();

关于c++ - 当 auto 遇到多态和虚函数时,正确的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38320732/

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