为什么派生类的构造函数只能在C ++的类中定义?

时间:2014-02-01 09:06:09

标签: c++ class

为什么我的代码会抛出一个编译错误,抱怨对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;
}

2 个答案:

答案 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;
}

你会得到同样的错误。