c++ 父类方法中调用父类声明的纯虚函数?
迷茫
迷茫 2017-04-17 11:40:05
0
4
639

c++ 父类方法中调用父类声明的纯虚函数,可以这样做吗?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(4)
刘奇

可以. 經典的應用場景為 template method pattern.
http://sourcemaking.com/design_patterns/template_method/cpp/1

大家讲道理

可以

#include <iostream>

class Base {
    public:
        void func() {
            virtualFunc();
        }   

        virtual void virtualFunc() = 0;
};

class Derived : public Base {
    public:
        void virtualFunc() {
            std::cout << "xxx" << std::endl;
        }   
};

int main()
{
    Derived d;
    d.func();
}
左手右手慢动作

c++並沒有說你不可以這樣做,上面的回答已經告訴你答案了。

我這裡想說的是,你想透過這樣的設計達到什麼樣的目的。
1. 你的純虛函數都是public的
個人認為,如果是這樣情況,需要再仔細考慮一下,是否必須這麼做。是不是還有其他可替代方案,例如,在這個類別的外部對這些功能進行整合。一個類別的設計,它的public方法應該盡量設計成正交的才對(KISS)。如果你的新介面都是由public成員構成,你需要考慮一些後期維護問題,還有是不是方便對其做單元測試。
2. 你的純虛函數不都是public的
我想你有足夠的理由來創建這個新接口,但是還請盡量保持你接口功能的正交性。

黄舟

可以,但是有限制條件!

class A
{
    public:
    virtual void print() 
    {
        cout << "virtual function" << endl;
    }
    static void static_func() 
    {
        print();
    }
};

你只能在非static成員方法中調用,因為虛擬函數的調用依賴於物件(和普通成員方法一樣),在static成員方法中,並沒有隱式傳入this指針,也就是說上面的程式碼是錯誤的,錯誤訊息如下:

其實從另一個角度看的話,也是不行的,即使這段程式碼編譯通過,但是static方法的呼叫是可以只透過型別名稱就可以的,那麼此時該如何呼叫虛函數呢?虛擬函數的實作機制就是在物件頭儲存一個虛表指針,你連物件都沒有,該如何在運作的時候呼叫該虛函數呢?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板