C++ 在这种情况下,我们为什么要实现纯虚函数?

C++ 在这种情况下,我们为什么要实现纯虚函数?,c++,C++,我的代码: 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,然后在编译此程序时,遇到以下错误: error LNK2019: unresolved external sy

我的代码:

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,然后在编译此程序时,遇到以下错误:

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)

我想知道,我们需要一直实现纯虚拟函数吗?

您应该在调用它时实现它。否则就不行了。 纯虚拟意味着可以创建包含它的类的实例,而不是调用方法,在这种情况下,没有任何东西可以阻止您从派生类调用纯虚拟方法-需要实现


Upd:在您的情况下,当调用基类的析构函数时-需要实现,请参见上面的解释。

根据定义,纯虚拟函数是一个需要始终在继承对象中定义的虚拟函数。所以答案是肯定的,你有。如果您真的不需要它,您可以只定义一个内部没有代码的函数。

一般来说,您不需要实现纯虚拟函数。事实上,这是一个重点。但是,对于析构函数,您可以这样做,因为析构函数没有实现是不可接受的。这是因为与常规虚拟方法不同,在运行时只使用派生度最高的方法,继承链中的所有虚拟析构函数都是从派生度最高的到派生度最低的调用,因此可以正确销毁派生对象的所有字段


出于这个原因,最好不要将虚拟析构函数设为纯函数,除非在必要的情况下(例如,当您有一个基类,该基类必须是抽象的,但没有其他虚拟方法可以设为纯函数)。

如果调用纯虚函数,则必须实现它。例如:

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

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

void B::f() { std::cout << "B::f called\n"; }
对于
B::f
的定义,还必须有
a::f
的定义


虚拟析构函数也是如此:如果调用了它,就必须实现它。析构函数的不同之处在于基类中的析构函数总是由派生类的析构函数调用,因此必须始终实现纯虚拟析构函数。即使它不起任何作用。

为什么要使用纯虚拟析构函数?纯虚拟析构函数提示:@Nbr44我想要一个抽象类。
void B::f() { A::f(); std::cout << "B::f called\n"; }