2016-07-06 91 views
0

是否有任何區別:將對象投射到基類或派生類?

cBase* object = new cDerived(); 

cDerived* object = new cDerived(); 

如果是這樣,在這種情況下,我選擇了另一種?

+0

'cBase * object;'和'cDerived * object;'有什麼區別? – immibis

+0

這就是我想找到的。 – drum

回答

4

區別在於他們聲明object具有不同的類型,這可能會產生很多後果。例如:

  • 如果cDerived宣佈任何新成員(超出了它cBase繼承),那麼只有cDerived* object版本使那些可用的(除非你明確地垂頭喪氣回到cDerived*)。
  • 如果cBase聲明cDerived覆蓋的任何非虛擬成員函數,那麼調用哪個函數取決於您用來調用它的指針的類型。
  • 如果函數預期採取cDerived*,那麼您無法將其傳遞給cBase*(除非您明確地將其轉回cDerived*)。
2

object的靜態類型在您的兩個示例中有所不同。讓我們舉個例子:

struct A {}; 

struct B : A 
{ 
    void method() {} 
}; 

int main() { 
    A* a = new B; 
    B* b = new B; 
    a->method(); // compile error, A has no member named method. 
    b->method(); // fine. b's static type is B*, and B has a member named method 
} 

這不要緊,a實際指向一個B對象;其靜態類型是A*A沒有名爲method的成員。