[英]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.