为什么我的代码会抛出一个编译错误,抱怨对Base :: Base()的未定义引用,对于Derived的未定义引用,以及'.ctors'部分中的错误reloc地址0x0。但是当我在类中定义Derived的构造函数时,编译器能够编译代码。
#include <iostream>
class Base{
public:
Base();
virtual ~Base();
};
class Derived : public Base{
public:
Derived(double theob_);
virtual ~Derived();
private:
double theob;
};
Derived::Derived(double theob_):theob(theob_){}
int main(){
return 0;
}
答案 0 :(得分:4)
您的编译单元声明 Base::Base()
但未定义它。类的主体外部的派生构造函数实现为非内联函数,因此将始终生成,并将引用未包含在编译单元中的构造函数。如果在类描述中包含派生的构造函数,它将被内联,并且编译器将仅在实际调用它时为其生成代码。在您的情况下,它不是,因为您从未构造Derived
的实例。如果您实际构建了这样的实例,例如通过在Derived d;
内写main
,您会遇到同样的问题。您可以将Base::Base
设为内联无操作:
class Base{
public:
Base() {}
virtual ~Base();
};
答案 1 :(得分:0)
在其类中定义构造函数时,可以使构造函数成为内联方法。因此,在需要之前不会实例化 - 即直到你没有声明类的变量 试试这个:
int main(){
Derived var(0.0);
return 0;
}
你会得到同样的错误。