2013-01-11 63 views
12

這個問題是相似的,但大約是從類中調用該函數:Can I call a base class's virtual function if I'm overriding it?有沒有辦法在C++的類外調用一個基本函數?

在這種情況下,你會指定Base::function()代替function(),這將調用重寫的定義。

但是有沒有辦法在課堂之外做到這一點?我的類沒有定義拷貝構造函數,所以我無法弄清楚如何投基類:

Base(derived_object).function() 

是在這裏做投& derived_objectBase*,然後調用->function()適當的事情嗎?

感謝您的洞察力。

+1

雖然我不確定虛擬函數的重點在於它們是在運行時解析的,但與對象的編譯時間類型無關,'static_cast'可能會起作用,'dynamic_cast'肯定不起作用。 –

+0

你爲什麼想要?如果函數是派生類和基類的一部分,那麼在調用基類時可能會出錯。解決這個問題的更好的方法是在基類中創建一個獨立的函數,以便派生類被調用,並讓基類調用functoion本身。 –

+0

請在下面看到@Omnifarious的評論。 – user

回答

18

嘗試derived_object.Base::function();

+0

那是標準嗎?如果是這樣,那就是訣竅。 – user

+1

@Oliver:是的,它是標準的。 – Mankarse

+4

@Oliver class :: function()是成員函數的'全名'。如果你沒有爲你調用的函數指定類,它將是'默認'(在你的案例中派生一個)。 – Eric

9

我相信語法:

derived_ptr->Base::function(); 

的作品就好了。雖然我真的質疑你爲什麼想在一個不屬於你課堂的功能中做到這一點。特別是如果function碰巧是一個虛擬功能。

這是一個值得懷疑的想法,其原因是您使用該表示法的原因取決於您的類的繼承層次結構。而且,通常會因爲某個原因而忽略函數。你可以通過使用這種語法來解決這個問題。

+1

謝謝 - 我有一個生成報告的Base對象,以及生成報告的Derived對象(帶有基本報告的額外信息)。所以我通過Base :: generate_report創建基本報告,然後複製額外的信息。這是在類之外使用訪問者模式完成的(更好地分離關注點) - BaseReport由Base構建,DerivedReport由Derived構造。唷! – user

0

你可能想使用指針到一個類的成員函數。這些可以讓你根據需要將不同的基類函數映射到指針,並且可以將它用作變量或函數參數。

爲指向一個成員函數的語法看起來像

class Base 
{ 
public: 
    virtual bool Function(); 
    virtual bool OtherFunction(); 
}; 

typedef bool (Base::*)() BaseFunc; 

警告使用這些東西的名單是一英里長有很多網上關於如何使用他們(大部分的答案是「別」)。但是,它們確實爲您提供了一種明確綁定並調用基類成員函數的方法。

+0

typedef語法錯誤。 – aschepler

相關問題