怪我咯2017-04-17 11:42:05
可以. 經典的應用場景為 template method pattern
.
http://sourcemaking.com/design_patterns/template_method/cpp/1
大家讲道理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();
}
ringa_lee2017-04-17 11:42:05
c++並沒有說你不可以這樣做,上面的回答已經告訴你答案了。
我這裡想說的是,你想透過這樣的設計達到什麼樣的目的。
1. 你的純虛函數都是public的
個人認為,如果是這樣情況,需要再仔細考慮一下,是否必須這麼做。是不是還有其他可替代方案,例如,在這個類別的外部對這些功能進行整合。一個類別的設計,它的public方法應該盡量設計成正交的才對(KISS)。如果你的新介面都是由public成員構成,你需要考慮一些後期維護問題,還有是不是方便對其做單元測試。
2. 你的純虛函數不都是public的
我想你有足夠的理由來創建這個新接口,但是還請盡量保持你接口功能的正交性。
黄舟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方法的呼叫是可以只透過型別名稱就可以的,那麼此時該如何呼叫虛函數呢?虛擬函數的實作機制就是在物件頭儲存一個虛表指針,你連物件都沒有,該如何在運作的時候呼叫該虛函數呢?