2012-11-13 215 views
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; 
} 

爲什麼兩個印刷品的行爲不同?類和指針的C++類型鑄造

+0

他們爲什麼不應該這樣做?你正在調用不同類型對象的成員函數。 –

+1

'一個acast =(A)b;'不會*轉換*'b',它*轉換*它。有一個區別。 –

回答

7

A acast=(A)b;(假設這是您實際擁有的)切片該對象並使用切片對象進行復制構建A。它相當於A acast=A(b);acast是動態和靜態類型A - 不再是B。這是一個全新的對象。

A *apointer=&b;相反,它是一個指向動態類型爲B的對象的指針。原來的b對象沒有被修改,它只是被一個指向基類型的指針引用。由於動態類型爲B,因此調用方法fooB(因爲它是virtual,這就是多態性是如何工作的)。

+0

對象切片似乎是當天的主題...... –

3

對象切片,切片A acast=(A)b;

1

第一個例子是一個明確的投編譯器瞭解的對象是A型。在第二個例子中,你只是設置指針和編譯器仍然看到對象爲類型B.