很明顯,內聯定義是不允許的。在類定義之外定義純虛函數
所以,我想知道這種情況下,使用二進制作用域分辨率運算符在類定義之外定義純虛函數的做法是有用的嗎??
一種情況我能想到的是假設所有派生類必須在純虛函數定義和通用功能一些公用的代碼/功能可以被包括在純虛函數本身和的基礎類定義可以在派生類的純虛函數定義中調用純虛函數的基類版本。 (不知道語法是否工作)。
很明顯,內聯定義是不允許的。在類定義之外定義純虛函數
所以,我想知道這種情況下,使用二進制作用域分辨率運算符在類定義之外定義純虛函數的做法是有用的嗎??
一種情況我能想到的是假設所有派生類必須在純虛函數定義和通用功能一些公用的代碼/功能可以被包括在純虛函數本身和的基礎類定義可以在派生類的純虛函數定義中調用純虛函數的基類版本。 (不知道語法是否工作)。
事實上,當你想調用在基類的純虛擬成員函數中定義的通用功能。
(不知道是否語法工作雖然)。
它的工作原理是這樣的:
#include <iostream>
#include <memory>
struct Foo
{
virtual void f() = 0;
virtual ~Foo() = default;
};
void Foo::f()
{
std::cout << "common functionality" << std::endl;
}
struct Bar: Foo
{
void f() override
{
Foo::f(); // call the base pure virtual implementation, common functionality
std::cout << "derived functionality" << std::endl;
}
};
int main()
{
std::unique_ptr<Foo> upFoo{std::make_unique<Bar>()};
upFoo->f();
}
又見斯科特邁爾斯C++有效項目34這個主題的一個非常詳細的討論。
一個明顯的例子是當你有一個純粹的虛擬析構函數。析構函數雖然是純粹的,但在派生類的對象被銷燬時仍然會被調用。因此,析構函數被使用並需要定義。在大多數情況下,你只是想明確地默認它。它仍然執行析構函數的通常職責,調用非靜態成員和更多基類的析構函數。
對我來說並不那麼明顯,「不允許內聯定義[純虛函數]」。關鍵字「inline」在任何地方都不會產生警告或錯誤(在Ubuntu上使用gcc 4.8.1)。所以也許我不確定你會把'內聯'放在哪裏來產生警告/錯誤? – 2015-04-04 20:21:51
@ DOUGLASO.MOEN我認爲OP意味着在類中定義它(這會自動內聯)。我同意使用'inline Foo :: f()'工作。儘管通常虛擬函數不應該是「內聯」的,因爲編譯器在運行時決定運行哪一個函數。 – vsoftco 2015-04-04 20:24:48