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();
}
Run Code Online (Sandbox Code Playgroud)
因为d->f();,输出是D.这是正确的.但是b.f();,输出是B.这是正确的吗?
son*_*yao 14
这是正确的吗?
没错,类型是在编译时推断出来的.auto使用相同的模板参数推导规则进行类型推导,基于静态类型,不会考虑动态多态.
对于这种情况,类型d是B*,然后类型*d是B,所以类型b只是B.然后*d将切片复制到b,b.f() B::f()应该被调用.
代码等同于以下可能更清楚的代码.
B b = *d;
b.f();
Run Code Online (Sandbox Code Playgroud)