据我所知,构造函数不是继承的,但是当我尝试使用这段代码时,它会抛出一个关于没有适当的默认构造函数的错误
// 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;
}
我在这里失踪的是什么? 感谢
答案 0 :(得分:3)
这就是OO的工作方式。在你的例子中,由于继承,你声明Resistance也是一个元素,只是一种特殊的元素。
在没有构建基础的情况下构造子类是没有意义的;它会使基础处于不一致(或相当未初始化)的状态。
将Element()
声明为protected,以避免实例化基类,就像在示例中所做的那样。
答案 1 :(得分:0)
您的问题有两个问题:
每个Resistance
包含需要构建的Element
子对象。毕竟,您随后可以将Resistance*
分配给Element*
。试想一下这意味着什么,并且应该清楚必须调用Element
的构造函数。
如果在类中声明默认构造函数,则向编译器声明您对它通常生成的默认构造函数不满意。因此,您需要实际为其提供实现。