0

我讀過一本書Stephen Prata - 「C++ Primer Plus VI Edition」,在抽象類中,我可以寫一個純方法的定義。我明白我可以編寫例如void pure() = 0,然後我可以在這個類中定義該方法。我認爲= 0只是使類抽象,如果我讓這個類繼承另一個類,我不必覆蓋它(我不知道「覆蓋」一詞是否正確,我的意思是我不想通過在第二級中編寫一個具有相同名稱的方法來將該方法從基本類中隱藏起來)。抽象類和純粹的方法C++

我在編譯器中檢查過它,並得到警告「它沒有覆蓋」。因此,如果我必須在二級類中覆蓋這種純粹的虛擬方法(在抽象類中定義),那麼我如何使用基本類中的這個定義?它沒用嗎?

+0

我認爲你正在尋找的單詞是「_override_」。 – rodrigo

+1

如果你聲明'''void pure()= 0''',那麼你不能在該類中的任何地方定義''void pure(){...}'',並且必須定義void' ){...}'''在任何子類中(如果你不這樣做,子類也被認爲是抽象的)。 –

+1

@Commander香菜蠑螈你錯了。純虛函數可能有一個定義。 –

回答

1

您正在尋找這樣的事情:

class Abstract { 
public: 
    virtual void f() = 0; 
}; 

// A pure virtual function can still be defined. 
// It has to be defined out-of-class. 
void Abstract::f() { 
    // Do something 
} 

class Concrete : public Abstract { 
public: 
    void f() { 
    Abstract::f(); // call base class implementation 
    // Do something more 
    } 
}; 
+0

非常感謝你 – groosik

0

如果你想要實例繼承類,即創建該類型的對象,你必須在繼承的類中實現所有純虛方法。

換句話說,純粹的虛擬方法不僅定義了類接口,還迫使你提供它們的實際實現。

1

這裏是解釋的純函數

的概念的示例
#include <iostream> 

struct A 
{ 
    virtual ~A() = default; 
    virtual void what() const = 0; 
}; 

void A::what() const 
{ 
    std::cout << "struct A"; 
} 

struct B : A 
{ 
    virtual void what() const = 0; 
}; 

void B::what() const 
{ 
    A::what(); 
    std::cout << ", struct B : A"; 
} 

struct C : B 
{ 
    void what() const; 
}; 

void C::what() const 
{ 
    B::what(); 
    std::cout << ", struct C: B"; 
} 


int main() 
{ 
// A a; compiler error 
// B b; compiler error 
    C c; 

    const A &rc = c; 

    rc.what(); 
    std::cout << std::endl; 

    return 0; 
} 

程序輸出是

struct A, struct B : A, struct C: B 

在這個例子中的類A和B是抽象的,因爲它們具有純虛函數雖然它們中的每一個都提供了其純虛函數的相應定義。

只有C類不抽象,因爲它將虛函數重新聲明爲非純虛函數。