层次结构中的类的编译器错误

时间:2015-04-01 19:06:26

标签: c++ class oop inheritance virtual-functions

我有以下代码

class interfaceBase // abstract class
{
public:
    virtual void vf1() = 0;
};

class tempBase : public interfaceBase  // manages a resource
{
    tempBase(int a) { var = new int[a]; }
    ~tempBase(){ free(var); }
private:
    int* var;
};

class derived : public tempBase // class I intend to instantiate.
{
public:
    derived(int rhs){ tempBase(var); } // ERROR - Pasted below
    void vf1() override final {}
};

int main()
{
    int a = 5;
    derived d(a);
}

我有一个需要管理的资源,我创建了一个名为tempBase的单独类,其作用是管理该资源。但是,这给我留下了一个问题 - 我无法构造derived类型的对象,因为似乎没有办法将构造函数调用到tempBase

我收到错误说

error C2512: 'tempBase' : no appropriate default constructor available
error C2259: 'tempBase' : cannot instantiate abstract class

如何更改我的代码,以便我可能仍然由tempBase处理所有资源管理,并且derived也可以实例化。

2 个答案:

答案 0 :(得分:1)

你可以把它放在初始化列表中:

derived(int rhs) : tempBase(var) { } // No erroranymore - see below

有关原始代码中错误的一些其他说明:

  • 由于没有tempBase的初始值设定项,编译器尝试生成默认构造函数,以便在执行构造函数体之前构造所有成员变量。
  • 正文中的tempBase(var)会创建另一个类tempBase的临时匿名对象,但不允许直接实例化纯虚拟类

答案 1 :(得分:1)

构造派生对象的基础部分时,需要使用

derived(vars) : base(vars) { constructor code here }