2016-12-02 110 views
-1

我想確定如何在派生類中命名我的虛函數。派生類中的虛函數命名

Base.h 
class Base 
{ 
public: 
    virtual void Virtual() = 0; 
}; 

Derived.h 
class Derived : public Base { 
public: 
    void Virtual(); 
}; 

Derived.cpp 
Derived::Virtual() // or Base::Virtual 
{ 
    cout << "Derived Virtual.\n"; 
} 

我是否在實現文件中使用Derived :: Virtual或Base :: Virtual,以及哪種方法會遇到問題?

+1

爲什麼你想爲'Derived'定義函數時需要'Base ::'? – NathanOliver

回答

1

這取決於你想達到什麼。

Derived::Virtual將定義重寫函數,而Base::Virtual將定義基類函數。兩者都可以完成。你不能跳過定義前者,即Derived::Virtual,因爲它不是純虛擬的,並且一旦在你沒有定義的時候被調用,就會產生連接錯誤。

應當把它定義Base::Virtual提供一些常見的行爲,然後由完全限定像這樣調用該函數,而無需使用虛擬調度:

void Derived::Virtual() { 
    Base::Virtual(); 
    std::cout << Derived::Virtual() < "\n"; 
} 

參考見C++ pure virtual function have bodyDoes it make any sense to define "pure" virtual functions in the base class itself?

+2

這完全是反模式,因爲程序員可能很容易忘記調用,編譯器也不會注意到,導致奇怪的運行時錯誤。一個更好的方法是有一個**公共非虛擬**函數,它具有共同的行爲並且調用一個**私有純虛擬**函數在派生類中實現。 –

+0

@ChristianHackl對,這是模板方法。我其實並沒有這樣看,只是通過完全限定它來引用純粹的虛擬函數的普遍習慣用法。這個C++功能的真實用例是什麼? – iksemyonov