2
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;
}

为什么这两个打印的行为不同?

4

3 回答 3

7

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

A *apointer=&b;相比之下, 是指向动态类型为 的对象的指针B。原始b对象没有被修改,它只是由指向基类型的指针引用。由于动态类型是B,因此调用了foofrom方法B(因为它是virtual并且这就是多态性的工作方式)。

于 2012-11-13T20:42:59.830 回答
3

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

于 2012-11-13T20:43:36.760 回答
1

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

于 2012-11-13T20:44:35.103 回答