2012-08-29 26 views
8

調用父類的功能,我有:C++:如何從外部

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

class B : public A{ 
    public: 
     void foo(); 
}; 

B *ptr = new B(); 

我想打電話給A的foo()直接使用「PTR」指針。

當我嘗試

(A*)ptr->foo(); 

它仍然調用B的版本foo()。我如何調用A的版本?

這可能嗎?有什麼選擇?謝謝。

+0

看看http://en.wikipedia.org/wiki/Scope_resolution_operator – Pramod

+0

你能澄清你的意思是「沒有工作」嗎?當你嘗試上面的代碼時會發生什麼? –

+3

這樣做完全違背了虛擬函數的目的,所以它意味着類「A」的用戶正在逃避類設計者的意圖。這可能意味着某處存在設計錯誤:「A」不提供所需的所有功能,或者「A」的用戶不理解「A」應該執行的操作。 –

回答

18

當您使用::範圍解析表單命名函數時,您可以調用命名函數,就好像它不是虛擬的。

ptr->A::foo(); 
+3

+1。這是正確的,但如果您也談論OP代碼中的可訪問性問題會更好。 – Nawaz

+3

@Nawaz:甚至更好的是,如果這個事實違反所有的OO原則也被提及:)'B'的用戶不應該在乎什麼版本的'foo'被調用,這是多態的主要觀點。 –

2

您需要公開您的職能。你這樣做僅僅通過進行以下更改:

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

class B : public A{ 
    public: 
     void foo(); 
}; 

當你不這樣做,該功能是從「外面」自動私人和交通不便。

+0

他們是公開的,我只是沒有在例子中指定。 – nahpr

+4

@nahpr爲了將來的參考,我建議你儘可能不要向你在這裏發佈的代碼引入額外的錯誤。這將有助於避免浪費時間對無用的答案進行排序。 –