gpt4 book ai didi

C++ 继承 : Avoid calling default constructor of base class

转载 作者:太空宇宙 更新时间:2023-11-04 15:39:51 24 4
gpt4 key购买 nike

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

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

然后:在三角形中构造 width = a;和高度= 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;
}

最佳答案

您没有在派生构造函数中执行任何操作。派生类隐式调用基类的默认构造函数,这是无法避免的。相反,您应该将派生构造函数的参数委托(delegate)给基础构造函数。

首先,一个小问题。您的代码在构造函数中初始化变量,在 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;}
};

之后,它应该可以正常工作。

关于C++ 继承 : Avoid calling default constructor of base class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25225331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com