4

我的代码:

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)

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

4

4 回答 4

9

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

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

于 2013-08-07T12:32:38.193 回答
1

应该在调用它时实现它。否则不是。纯虚拟意味着t be created, not that method coudn不能调用包含它的类的实例,在这种情况下,没有什么能阻止您从派生类调用纯虚拟方法 - 需要实现

更新:在您的情况下,由于调用了基类的析构函数-需要实现,请参见上面的说明。

于 2013-08-07T12:31:42.930 回答
1

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

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

与虚拟析构函数相同:如果调用它,则必须实现它。析构函数的不同之处在于基类中的析构函数始终由派生类的析构函数调用,因此您必须始终实现纯虚拟析构函数。即使它什么也没做。

于 2013-08-07T12:57:39.723 回答
0

纯虚函数,顾名思义,就是需要在继承对象中定义的虚函数。所以答案是肯定的,你有。如果你真的不需要它,你可以定义一个内部没有代码的函数。

于 2013-08-07T12:31:46.360 回答