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(); }
解决方法
Is this right?
没错,类型是在编译时推断出来的. auto
使用相同的template argument deduction规则进行类型推导,基于静态类型,不会考虑动态多态.
对于这种情况,d的类型是B *,那么* d的类型是B,所以b的类型只是B.然后* d将是slicing copied到b,对于bf()B :: f()应该是调用.
B b = *d; b.f();