C ++抽象基类模板

时间:2011-01-20 19:58:46

标签: c++ templates abstract-class

这段代码出了什么问题?

template <class T>
class A
{
private:
    T a;

public:
    A(): a(0) {}
    virtual ~ A() = 0;
};


template <class T>
class A;

template <class T>
class B : public A<T>
{
private :
    T b;

public:
    B() : A<T>() {}
    virtual ~B(){}


};


int _tmain(int argc, _TCHAR* argv[])
{
B <double> bb;
return 0;
}

错误LNK2019:未解析的外部符号“public:virtual __thiscall A ::〜A(void)”(?? 1?$ A @ N @@ UAE @ XZ)在函数“public:virtual __thiscall B ::〜”中引用B(无效)“(?? 1?$ B @ N @@ UAE @ XZ)

3 个答案:

答案 0 :(得分:9)

您将A的析构函数声明为纯虚拟。这一切都很好,如果你想保证类永远不会被实例化,那么它可以被认为是一种很好的做法。但是,您必须在代码中的某处定义A::~A(),因为B的析构函数会自动调用A::~A()对象上的B。由于您将其声明为纯虚拟,因此无法像使用~B那样将其内联定义;你必须在类定义之外包含它的定义。

答案 1 :(得分:0)

您需要为基类析构函数提供实现。即使析构函数被声明为纯虚拟,也需要实现来销毁派生类。

答案 2 :(得分:0)

你的超类析构函数不应该是纯虚拟的,只是虚拟的。

virtual ~A() {}

B的析构函数将自动尝试调用A的析构函数。

相关问题