簡體   English   中英

是否可以從超類實現中調用子類虛擬函數?

[英]Is it possible to call a subclass virtual function from within superclass implementation?

#include <iostream>

using namespace std;

class Parent
{
public:
    Parent() {}
    virtual void foo() { cout << "My favorite song is:"; bar(); }
    virtual void bar() {}
};

class Child : public Parent
{
public:
    Child() : Parent() {}
    virtual void bar() { cout << "Singing in the Rain"; }
    void baz() { Parent::foo(); }
};

int main()
{
      Child().baz(); // Outputs "My favorite song is: Singing in the Rain"
      return 0;
}

答案是肯定的。 上面的代碼按預期工作。

是否可以從超類實現中調用子類虛擬函數?

當然有可能。 但是您實際上需要建立該繼承關系。 例如:

class Child : public Parent
//          ^^^^^^^^
//          For instance...
{
public: // Make at least baz() accessible from the outside
    // ...
}; // <== And don't forget the semicolon here

而且,如果必須由Child調用它們,則還需要賦予基類中的成員函數適當的可訪問性:

class Parent
{
public: // <== For instance, you could make the member functions public
    virtual void foo() { cout << "My favorite song is:"; bar(); }
    virtual void bar() {}
}; // <== Do not forget this

有關完整示例,請參見此實時演示

是否可以從超類實現中調用子類虛擬函數?

是的,但是要從構造函數和析構函數中進行此操作,請注意,因為對象的類型會隨着不同的構造函數/析構函數的完成而演變。 特別是在執行Parent構造函數/析構函數期間,無論所構造的整個對象的類型如何,對象的類型都是Parent

代碼中有一些氣味(除了編譯器將捕獲的明顯語法錯誤和缺乏繼承性)。 例如, foo是基礎中的虛函數,但是在Child::baz的實現中,您顯式調用了該覆蓋(即,禁用動態調度),這可能是有意的(您可以僅調用foo() )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM