2013-03-19 121 views
0

我有一個也有一個正常方法的接口,那麼我該如何調用呢?C++從實現的虛擬類調用非虛方法

class Animal{ 
    virtual void virtualFunction()=0; 
} 

class Cow : Animal{ 
    virtual void virtualFunction(){} 
    void nonVirtualFunction(){} 
} 

class main{ 
    Animal *a = new Cow(); 
    a->virtualFunction(); 
} 

^:這工作,但是當我做...

a->nonVirtualFunction(); 

它說,類動物沒有這種方法,我知道ofcourse, 但什麼方法最好稱之爲方法

回答

3

如果你要調用一個函數是Cow成員,不要將其存放在多態Animal指針擺在首位:

Cow* c = new Cow(); 
c->nonVirtualFunction(); 

它沒有意義的存儲如果您打算以Cow特定的方式使用它,請在中輸入Animal*

可以使用dynamic_cast在運行時檢查動態類的一個對象:

Animal* a = new Cow(); 
if (Cow* c = dynamic_cast<Cow*>(a)) { 
    c->nonVirtualFunction(); 
} 

然而,這通常是糟糕的設計標誌。

+0

非常感謝,不知道,我會用Cow * c = new Cow();確實! – 2013-03-19 15:08:45

1

您需要使用Cow指針來調用nonVirtualFunction。動物指針是指向具有動物界面的牛的SUBSET的指針。

調用nonVirtualFunction的唯一方法是獲取Cow指針。

Cow *c = dynamic_cast<Cow*>(a); 

會給你這樣一個指針,假設一個真的指向一個牛。

+0

我會去牛* c =新牛();確實!感謝hlp – 2013-03-19 15:09:03

1

我會爲了使用實名的方法,而不是佔位符,以便更好地解釋一下:

class Animal{ 
    virtual void move()=0; 
} 

class Cow : Animal{ 
    virtual void move(){} 
    void moo(){} 
} 

int main() { 
    Animal *a = new Cow(); 
    a->move(); 
    a->moo(); // ERROR 
} 

嘛,當然這是一個錯誤的:爲什麼地球上,你會想使一個普通的Animalmoo?所以問題不在於如何在任何Animal上致電moo;只是這個調用沒有意義,編譯器可以幫助我們注意到。現在

,一個Animal可能有一個非虛方法可以在任何動物被稱爲無需重寫它的子類,例如:

class Animal{ 
    // Everything else, plus: 
    std::string Name() {return name;} 

private: 
    std::string name; 
} 

int main() { 
    Animal *a = new Cow(); 
    a->move(); 
    std::string animalName = a->Name(); // OK 
} 

正如你所看到的,如果你有一個好的設計問題消失。

+1

嗯的確,你的方式與真實姓名,而不是佔位符確實更清晰!將這樣做:) 但是,謝謝,現在確實有答案,應該只是讓一頭牛* c =新牛! – 2013-03-19 15:07:40