我有一个基类(让我们称之为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
答案 0 :(得分:3)
您不需要为BaseClass
编写构造函数,它将被赋予"默认构造函数" (无论如何,复制构造函数)。这个编译器生成的默认构造函数将由DerivedClass
构造函数自动调用。
至于您的链接错误,可能是因为您未能为BaseClass
定义虚拟析构函数。您需要使用空体来定义它,即使它是纯虚拟的(它应该是virtual
,它是纯的(=0
)还是不是无关紧要的。)