class A{
public:
virtual void foo() {cout << "A::foo" << endl;}
};
class B: public A{
public:
virtual void foo() {cout << "B::foo" << endl;}
};
int main(void){
A a;
B b;
A acast=(A)B;
A *apointer=&B;
acast.foo(); // A::foo
apointer->foo() //B::foo
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么两个印刷品的表现不同?
A acast=(A)b;(假设这是你实际拥有的)切片对象并使用切片对象复制构造一个A.它相当于A acast=A(b);.acast是动态和静态类型A- 不再是B.这是一个全新的对象.
A *apointer=&b;相反,它是指向动态类型为的对象的指针B.原始b对象未被修改,它只是由指向基类型的指针引用.由于动态类型是B,该方法foo从B被调用(因为它virtual,这就是多态性是如何工作的).