首頁  >  問答  >  主體

c++ 父类方法中调用父类声明的纯虚函数?

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

迷茫迷茫2765 天前631

全部回覆(4)我來回復

  • 怪我咯

    怪我咯2017-04-17 11:42:05

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

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:42:05

    可以

    #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();
    }
    

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 11:42:05

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

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

    回覆
    0
  • 黄舟

    黄舟2017-04-17 11:42:05

    可以,但是有限制條件!

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

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

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

    回覆
    0
  • 取消回覆