C ++继承:避免调用基类的默认构造函数

时间:2014-08-10 03:43:14

标签: c++

在下面的代码中,我正在计算三角形的面积。一旦我声明对象tri1,宽度和高度被初始化两次。

首先:调用基类的默认构造函数,并调用值width = 10.9; height = 8.0;自动分配给三角形。

然后:在三角形构造中宽度= a;和height = b;发生的情况。

但是,我的问题是:有没有办法不从基类调用任何构造函数?

class polygon {
protected:
    float width, height;
public:
    polygon () {width = 10.9; height = 8.0;}
    void set_val (float a, float b) {width = a; height = b;}
    polygon (float a, float b) : width(a), height(b) {cout<<"I am the polygon"<<endl;}
};

class triangle: public polygon {
public:
    triangle (float a, float b) {cout<<"passed to polygon"<<endl; width = a; height = b;} 
    float area () {return width*height/2;}
};

int main () {
    triangle tri1 {10, 5};
    cout<<tri1.area()<<endl;
}

2 个答案:

答案 0 :(得分:4)

您在派生的构造函数中没有做任何事情。派生类隐式调用基类的默认构造函数,并且无法避免它。相反,您应该将派生的构造函数的参数委托给基础参数。

首先,一个小问题。你的代码初始化了构造函数中的变量,在C ++中我们使用如下的初始化列表:

class polygon {
protected:
    float width, height;
public:
    polygon(): width(10.9), height(8.0) {}
    void set_val (float a, float b) {width = a; height = b;}
    polygon (float a, float b) : width(a), height(b) {cout<<"I am the polygon"<<endl;}
};

关于真正的问题;要解决您的问题,请使派生类显式调用基础构造函数:

class triangle: public polygon {
public:
    triangle(float a, float b): polygon(a, b) {cout<<"passed to polygon"<<endl;}
    float area () {return width*height/2;}
};

之后,它应该正常工作。

答案 1 :(得分:1)

不,你不能避免调用基类构造函数。您可以通过在派生类构造函数的初始化列表中指定基类构造函数并将参数传递给与基类构造函数原型匹配的构造函数来指定在派生类中调用哪个基类构造函数。从这些参数中推导出基类构造函数。