将参数传递给超类构造函数
Posted
技术标签:
【中文标题】将参数传递给超类构造函数【英文标题】:Passing arguments to a superclass constructor 【发布时间】:2013-05-10 04:48:47 【问题描述】:我刚刚进入派生类,我正在研究著名的Shape
类。 Shape
是基类,那么我有三个派生类:Circle
、Rectangle
和 Square
。 Square
是 Rectangle
的派生类。我想我需要将派生类构造函数中的参数传递给基类构造函数,但我不确定该怎么做。我想在创建形状时设置它们的尺寸。这是我的基类和一个派生类:
Shape(double w = 0, double h = 0, double r = 0)
width = w;
height = h;
radius = r;
class Rectangle : public Shape
public:
Rectangle(double w, double h) : Shape(double w, double h)
width = w;
height = h;
double area();
void display();
;
我在正确的轨道上吗?我收到以下编译器错误:expected primary expression before "double"
,在每个派生构造函数中。
【问题讨论】:
对于您的编译器错误,您必须删除冒号后Shape(double w, double h)
中的double
s,因为您实际上是在调用基类的构造函数。
另外,考虑使用成员初始化器来初始化 Shape 的成员,而不是赋值,即让 Shape 构造函数看起来像这样:Shape(double w = 0, ...) : width(w), height(h), radius(r)
。
通用形状的半径是什么意思?也许你需要重新考虑你的班级设计。
【参考方案1】:
您必须将Shape(double w, double h)
更改为Shape(w, h)
。您实际上是在调用这里的基本构造函数。
另外,你不必在派生类的构造函数体中设置width
和height
:
Rectangle(double w, double h) : Shape(w, h)
就够了。这是因为在您的初始化列表中,Shape(w, h)
将调用基类的构造函数 (shape
),它会为您设置这些值。
创建派生对象时,会执行以下操作:
Shape
的内存已预留
调用适当的 Base 构造函数
初始化列表初始化变量
构造函数的主体执行
控制权返回给调用者
在您的示例中,Shape
子对象由 Shape(double w = 0, double h = 0, double r = 0)
初始化。在这个过程中,基础部分的所有成员(width
、height
、radius
)都被基础构造函数初始化。之后,派生构造函数的主体被执行,但您不必在此处更改任何内容,因为它们都由基构造函数处理。
【讨论】:
Shape 构造函数的主体?那它可以是空的吗? @user2302335 我的意思是 Rectangle 构造函数的主体。【参考方案2】:几乎。而不是在这里重新声明参数:
Rectangle(double w, double h) : Shape(double w, double h)
您应该简单地“通过它们”(给出不准确的措辞):
Rectangle(double w, double h) : Shape(w, h)
【讨论】:
以上是关于将参数传递给超类构造函数的主要内容,如果未能解决你的问题,请参考以下文章