为什么c ++隐式调用父默认构造函数?

时间:2014-05-01 14:04:24

标签: c++ constructor

据我所知,构造函数不是继承的,但是当我尝试使用这段代码时,它会抛出一个关于没有适当的默认构造函数的错误

// Element.h
enum orientation{ up, down, left, right };

 class Element{
public:
    float get_value()  ;
    string get_unit();
    Point get_start_point();
protected:
    //Element(); // To prevent instatiation
    float value;
    const string unit;
    Point starting_point;
    orientation direction;

 };

class Resistance : public Element{
public:
    Resistance(Point,float,orientation);
private :
    const string unit = "Kohm";
};

从这个错误中,我得到了隐式调用父类构造函数。 请注意,当我声明Element的构造函数时,错误消失。

//Element.cpp
float Element::get_value(){
return value;
};
string Element::get_unit(){
    return unit;
}
Point Element::get_start_point()
{
    return starting_point;
}
Resistance::Resistance(Point p, float value, orientation direction){

    Resistance::starting_point = p;
    Resistance::value = value;
    Resistance::direction = direction;
}

我在这里失踪的是什么? 感谢

2 个答案:

答案 0 :(得分:3)

这就是OO的工作方式。在你的例子中,由于继承,你声明Resistance也是一个元素,只是一种特殊的元素。

在没有构建基础的情况下构造子类是没有意义的;它会使基础处于不一致(或相当未初始化)的状态。

Element()声明为protected,以避免实例化基类,就像在示例中所做的那样。

答案 1 :(得分:0)

您的问题有两个问题:

  1. 每个Resistance 包含需要构建的Element子对象。毕竟,您随后可以将Resistance*分配给Element*。试想一下这意味着什么,并且应该清楚必须调用Element的构造函数。

  2. 如果在类中声明默认构造函数,则向编译器声明您对它通常生成的默认构造函数不满意。因此,您需要实际为其提供实现。