类和指针的C++类型转换

Wei*_*Shi 2 c++ types casting

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)

为什么两个印刷品的表现不同?

Luc*_*ore 7

A acast=(A)b;(假设这是你实际拥有的)切片对象并使用切片对象复制构造一个A.它相当于A acast=A(b);.acast是动态和静态类型A- 不再是B.这是一个全新的对象.

A *apointer=&b;相反,它是指向动态类型为的对象的指针B.原始b对象未被修改,它只是由指向基类型的指针引用.由于动态类型是B,该方法fooB被调用(因为它virtual,这就是多态性是如何工作的).