[英]Pure virtual functions in C++11
在C ++ 98中,空指針由文字0
表示(或者實際上是值為零的任何常量表達式)。 在C ++ 11中,我們更喜歡使用nullptr
。 但這對純虛函數不起作用:
struct X
{
virtual void foo() = nullptr;
};
為什么這不起作用? 完全沒有道理嗎? 這僅僅是疏忽嗎? 會解決嗎?
因為語法說0
,而不是expression或其他一些非終端匹配的nullptr
。
一直以來,只有0
有效。 甚至0L
也會格式錯誤,因為它與語法不匹配。
編輯
= 0b0
允許= 0x0
, = 0b0
和= 00
(31.12.2013)。 那是不正確的,當然應該在編譯器中修復。
virtual
函數的= 0
表示法並不是字面上的“賦空值”,而是一種實際上具有欺騙性的特殊表示法:也可以實現純虛函數。
對於各種上下文關鍵字,允許abstract
而不是= nullptr
並讓abstract
作為上下文關鍵字會更有意義。
這就是語法的定義方式,如果我們看一下C ++標准草案第9.2
節Class成員,則相關的語法如下:
[...]
member-declarator:
declarator virt-specifier-seqopt pure-specifieropt
[...]
pure-specifier:
= 0
^^^
語法明確指出純說明符 = 0
而不是整數文字或表達式 ,似乎沒有留下任何擺動的余地。 如果我嘗試類似的事情:
virtual void foo() = 0L;
要么:
virtual void foo() = NULL ;
gcc
告訴我:
錯誤:“;”前的無效純說明符(僅允許“ = 0”) 代幣
和clang
說:
錯誤:函數的初始值設定項看起來不像純說明符
盡管以下兩種方法均適用:
#define bar 0
//...
virtual void foo() = bar;
似乎clang
允許使用八進制文字 , 十六 進制文字和二進制文字零,這是錯誤的行為。
更新資料
顯然, Visual Studio
接受NULL
和任何零整數文字 ,包括0L
, 0x0
, 00
等...雖然它不接受nullptr
。
= 0
在此處具有固定含義。 那里實際上不是整數零。 因此,您不能像這樣簡單地替換它。
nullptr
的全部要點(或大部分要點)是只能分配給(或用於初始化)指針的。
在這種情況下,您無需初始化或分配給指針,因此在這種情況下可以使用它甚至沒有意義。
= 0
語法不是用來初始化指針的,它只是在語法上表明所提供的virtual
是純凈的。
因此,用於聲明純virtual
s的= 0
語法不變。
這並不意味着它是一個指針,或者它必須等於nullptr
。
= 0
就足夠了,表示虛函數是純函數。
C ++ 11語法此處僅允許0
(並且不表示指針)。 由於nullptr
不為0
,因此失敗。 NULL
僅在將NULL
定義為0
時才起作用(有時是這種情況,但並非總是如此)。 只需在此處使用0
,或使用以下define(如果您真的想使用null(如果它不是指針),則使用它)。
#define VIRTUAL_NULL 0
struct X
{
virtual void foo() = VIRTUAL_NULL;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.