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

How to derive a base class with a class that only has a constructor with parameters when the base class doesn't specify a constructor?

我有一个从未实例化过的基类(我们称之为base class)(这是否称为虚拟基类?).另一个类(让我们调用usingclass)使用它,以便它可以将不同的派生类(derivedclassn)作为输入。因为我从未显式地实例化这个基类,所以我没有为它定义构造函数。派生类有一个构造函数,该构造函数采用基类不知道的类型,因此它不重写任何构造函数。我想知道为这两个类编写构造函数的正确方法。

现在,在baseclass i中,我声明在usingclass和derivedclass0中使用的公共变量和虚拟函数,重写这些函数,定义这些变量,并声明和定义接受参数的构造函数。但我得到以下错误:

1
2
3
4
undefined reference to `typeinfo for BaseClass'

undefined reference to `vtable for BaseClass'

test.o: In function `DerivedClass::~DerivedClass()'

我理解这是因为我从未为基类编写过构造函数或重写过无参数默认构造函数。但我这样做是没有意义的。派生类的构造函数的参数复杂到只在无参数的构造函数中实例化,而基类不知道派生类的参数以声明要覆盖的基类中的构造函数。所以我想知道我该怎么做。事先谢谢。

编辑

实际代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;

}

错误

1
2
3
4
5
6
7
8
/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


您不需要为BaseClass编写构造函数,它无论如何都会得到一个"默认构造函数"(和复制构造函数)。此编译器生成的默认构造函数将由DerivedClass构造函数自动调用。

至于链接错误,这可能是因为您没有为您的BaseClass定义虚拟析构函数。即使它是纯虚拟的(它应该是virtual,不管它是纯的(=0)还是非实质的),您也需要用一个空体来定义它。