如何在基类没有指定构造函数的情况下派生一个只有一个带参数的构造函数的类的基类?

时间:2015-12-20 01:30:48

标签: c++ inheritance constructor

我有一个基类(让我们称之为BaseClass),它从未被实例化(这被称为虚拟基类?)。另一个类(让我们调用UsingClass)使用它,因此它可以将不同的派生类(DerivedClassN)作为输入。因为我从未明确地实例化这个基类,所以我没有为它定义构造函数。派生类有一个构造函数,它接受基类不知道的类型,因此它不会覆盖任何构造函数。我想知道为两个类编写构造函数的正确方法。

现在在BaseClass中我声明了在UsingClass和In DerivedClass0中使用的公共变量和虚函数我覆盖这些函数,定义这些变量并声明和定义带参数的构造函数。但我得到以下错误:

undefined reference to `typeinfo for BaseClass'

undefined reference to `vtable for BaseClass'
test.o: In function `DerivedClass::~DerivedClass()'

我理解这是因为我从未编写过BaseClass的构造函数或者覆盖了无参数的默认构造函数。但这样做对我来说没有意义。 DerivedClass的构造函数的参数是复杂的,只是在无参数构造函数中实例化,而BaseClass并不知道Derived类的参数,以声明BaseClass中的构造函数被覆盖。所以我想知道我应该做些什么。提前谢谢。

修改

实际代码:

class BaseClass {
public:
    virtual ~BaseClass();
    virtual double  get(int the_params);
    virtual void    set(int he_params);
    int   _a_local;
};

class DerivedClass : public BaseClass {
    private:
        int _priveate_variables;
        void private_function();
    public:
        explicit DerivedClass(int the_int);
        virtual double  get(int the_int);
        virtual void    set(int the_int);
};

DerivedClass::DerivedClass(int the_int) : _priveate_variables(the_int) {
    _priveate_variables++;
    _a_local=_priveate_variables;
}


double DerivedClass::get(int the_int) {
     return 0.0;
}

void DerivedClass::set(int the_int) {
     _priveate_variables = 2;

}

错误

/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../../lib/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/ccC1wbix.o: In function `BaseClass::BaseClass()':
CodeForThem.cc:(.text._ZN9BaseClassC2Ev[_ZN9BaseClassC5Ev]+0x9): undefined reference to `vtable for BaseClass'
/tmp/ccC1wbix.o: In function `DerivedClass::~DerivedClass()':
CodeForThem.cc:(.text._ZN12DerivedClassD2Ev[_ZN12DerivedClassD5Ev]+0x20): undefined reference to `BaseClass::~BaseClass()'
/tmp/ccC1wbix.o:(.rodata._ZTI12DerivedClass[_ZTI12DerivedClass]+0x10): undefined reference to `typeinfo for BaseClass'
collect2: error: ld returned 1 exit status

1 个答案:

答案 0 :(得分:3)

您不需要为BaseClass编写构造函数,它将被赋予"默认构造函数" (无论如何,复制构造函数)。这个编译器生成的默认构造函数将由DerivedClass构造函数自动调用。

至于您的链接错误,可能是因为您未能为BaseClass定义虚拟析构函数。您需要使用空体来定义它,即使它是纯虚拟的(它应该是virtual,它是纯的(=0)还是不是无关紧要的。)