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;
}
为什么这两种印刷品的表现不同?
答案 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.