簡體   English   中英

為什么要在這種情況下實現純虛函數?

[英]why we should implement pure virtual function in this case?

我的代碼:

class A
{
public:
    A(){}
    A(int _a) : a(_a){}
    virtual ~A() = 0;
private:
    int a;
};


class B : public A
{
public:
    B(){}
    B(int _a):A(_a){}
    ~B(){}
private:
};

我宣布B b; ,那么當我編譯該程序時,遇到了以下錯誤:

error LNK2019: unresolved external symbol "public: virtual __thiscall A::~A(void)" (??1A@@UAE@XZ) referenced in function "public: virtual __thiscall B::~B(void)" (??1B@@UAE@XZ)

我想知道,我們是否一直需要實現純虛函數?

通常,您不需要實現純虛擬功能。 確實,這就是重點。 但是,使用析構函數可以這樣做,因為析構函數沒有實現是不可接受的。 這是因為與常規虛擬方法不同,在常規虛擬方法中,在運行時僅使用派生最多的方法,而從最高派生到最少派生調用了繼承鏈中的所有虛擬析構函數,因此可以將派生對象的所有字段正確銷毀。

因此,最好不要將您的虛擬析構函數設為純析構函數,除非在必要的情況下(即,當您有一個必須是抽象的基類,但沒有其他要虛化的虛擬方法時)。

調用它時,應該實現它 否則沒有。 純虛擬方法意味着t be created, not that method coudn包含該類的類的實例t be created, not that method coudn 調用該方法,在這種情況下沒有什么可以阻止您從派生類調用純虛擬方法的,即需要實現

更新:在您的情況下,由於調用了基類的析構函數-需要實現,請參見上面的說明。

如果調用了純虛函數,則必須實現它。 因此,例如:

struct A {
    virtual void f() = 0;
};

struct B : A {
    void f();
};

void B::f() { std::cout << "B::f called\n"; }

但是,如果B::f調用A::f ,則必須實現A::f

void B::f() { A::f(); std::cout << "B::f called\n"; }

有了B::f的定義,還必須有A::f的定義。

與虛擬析構函數相同:如果被調用,則必須實現。 析構函數的不同之處在於,基類中的析構函數始終由派生類的析構函數調用,因此您必須始終實現純虛擬析構函數。 即使它什么也沒做。

根據定義,純虛函數是需要一直在繼承對象中定義的虛函數。 因此,答案是肯定的。 如果確實不需要它,則可以定義一個內部沒有代碼的函數。

暫無
暫無

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

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