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

时间:2012-11-13 20:41:22

标签: 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;
}

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

3 个答案:

答案 0 :(得分:7)

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

相比之下,

A *apointer=&b;是指向动态类型为B的对象的指针。原始b对象未被修改,它只是由指向基类型的指针引用。由于动态类型为B,因此调用来自foo的方法B(因为它是virtual,这就是多态性的工作方式)。

答案 1 :(得分:3)

对象切片,A acast=(A)b;切片B

答案 2 :(得分:1)

第一个示例是显式强制转换,编译器将对象理解为类型A.在第二个示例中,您只是设置指针,编译器仍然将对象视为类型B.

相关问题