簡體   English   中英

如果C ++中的虛函數和純虛函數都沒有在基類中定義,則有什么區別?

[英]What is the difference between virtual function and pure virtual function in C++ in when both not defined in base class?

因為我添加了一個條件“當兩者都未在基類中定義時”,所以不會重復此問題。 如果在基類C中,我聲明virtual void display(); 而且它從未在類C中定義,它是一個虛函數。 我對嗎? 如果我發表這樣的聲明:“ virtual void display()= 0;” 它是一個純虛函數。 因此,在兩種情況下,派生類都必須定義顯示函數。 那么為什么我們需要純虛函數呢? 或我的陳述中有什么問題?

因此,在兩種情況下,派生類都必須定義顯示功能

不正確 只有純虛函數才能被派生類覆蓋,以使該派生類具體化。

那么為什么我們需要純虛函數呢?

指定類型為abstract ,以防止其實例化。

如果C ++中的虛函數和純虛函數都沒有在基類中定義,則有什么區別?

如前所述,純虛函數是使類抽象的東西。

通過聲明一個函數,您保證將有一個定義。 如果沒有定義,則程序格式錯誤。 純虛函數是例外,因為並非必須定義它們(但您可以)。 簡而言之,沒有定義的非純虛擬是一個錯誤。

“純虛擬方法”只是方法的名稱,在聲明它的類中沒有定義。 您必須這樣聲明一個純虛擬方法,以避免鏈接器錯誤。 考慮以下簡單示例:

/* abstract classes */
struct Broken { virtual void foo(); };
struct Fixed  { virtual void foo()=0; };

/* implementations */
struct A : Broken { void foo(){} };
struct B : Fixed  { void foo(){} };

int main() {
    //Broken* a = new A(); delete a; // (*)
    Fixed* a = new B(); delete a;
    return 0;
} 

(*)創建一個鏈接器錯誤(即使所創建的對象具有foo()定義)。 要告訴編譯器該方法是純虛擬方法,必須將=0;設置=0;

[...]為什么必須在基類中定義非純虛函數?

那就是它的定義方式。 有一些東西:基類中沒有定義的方法。 我們給它起一個名字:純虛方法。 爭論為什么純虛函數在基類中沒有定義,或者是否允許非純虛方法在基類中沒有定義,這是沒有道理的。

暫無
暫無

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

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