簡體   English   中英

我可以使用純虛擬功能覆蓋虛擬功能嗎?

[英]Can I override a virtual function with a pure virtual one?

我有三個班: BDG DBGD BD都是抽象的。 B來自第三方。

B有一個G需要實現的非純虛方法(成為D )。 將虛擬函數重新定義/覆蓋為純虛擬,我可以並且是一種好習慣嗎?

例:

class B // from a third party
{
public:
   virtual void foo();
};

class D : public B
{
public:
   void foo() override = 0; // allowed by gcc 4.8.2
   virtual void bar() = 0;
};

class G : public D
{
public:
   // forgot to reimplement foo
   void bar() override;
};

int main()
{
   G test;  // compiler error is desired
}

對於“我可以嗎?”的問題 gcc允許它,但是我沒有術語/詞匯表來驗證行為是標准的一部分還是未定義並且恰好在今天工作。

您詢問:

我可以使用純虛擬功能覆蓋虛擬功能嗎?

答案是:是的,你可以。 從C ++ 11標准:

10.4抽象類

5 [ 注意:抽象類可以從非抽象的類派生,純虛函數可以覆蓋不純的虛函數。 - 結束說明 ]

如果使用更現代的編譯器編譯代碼,那么您將收到以下錯誤消息來解釋該問題

prog.cc:23:6: error: variable type 'G' is an abstract class
   G test;  // compiler error is desired
     ^
prog.cc:10:9: note: unimplemented pure virtual method 'foo' in 'G'
   void foo() override = 0; // allowed by gcc 4.8.2
        ^
1 error generated.

至於標准那么(10.3虛擬功能)

11 在一個類中聲明的虛函數應在該類中定義或聲明為純 (10.4),或兩者兼有; 但不需要診斷(3.2)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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