簡體   English   中英

C ++ 11中的純虛函數

[英]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.2Class成員,則相關的語法如下:

[...]
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和任何零整數文字 ,包括0L0x000等...雖然它不接受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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM