2013-03-10 61 views
9

我有一個基類和一個擴展它的子類。子類在父類中沒有自己的方法。也就是說,在基類中聲明它是虛擬的並不是真正的選擇。如何從C++中的父指針調用子方法?

class A { 
    public: 
    virtual void helloWorld(); 
}; 

class B : public A { 
    public: 
    virtual void helloWorld(); 
    void myNewMethod(); 
}; 

然後,在我的實現,我有一個指向我構建它作爲B:

// somewhere in a .cpp file 
A* x; 
x = new B(); 
x->myNewMethod(); // doesn't work 

我目前的解決辦法是將它轉換:

((B *)x)->myNewMethod(); 

我的問題是,有沒有一種更清潔的方式來做到這一點,或正在擺脫困境?

回答

11

我的問題是,是否有一個更清潔的方式來做到這一點,或者是要走的路?

一個運行時投似乎是在這種情況下確定。然而,不是C-風格轉換,你應該使用dynamic_cast<>(如果你不知道x是否實際指向型的B的對象):

B* pB = dynamic_cast<B*>(x); // This will return nullptr if x does not point 
          // to an object of type B 
if (pB != nullptr) 
{ 
    pB->myNewMethod(); 
} 

在另一方面,如果你確定xB類型的對象,那麼你應該使用static_cast<>

B* pB = static_cast<B*>(x); 
pB->myNewMethod(); 
1

A沒有定義稱爲myNewMethod()的任何方法,因此它不能調用它。

即使我通常強烈勸阻鑄造,這裏確實是鑄造是唯一的方法

0

好吧,你要投,但你可以通過隱藏的醜陋鑄造語法功能使代碼看起來更清潔/更易讀。

B* B_static_cast(A* item) 
{ 
    return static_cast<B*>(item); 
} 

A* item = new B(); 
B_static_cast(item)->funtion_in_B();