我刚刚进入派生类,我正在着名的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"
。
答案 0 :(得分:3)
您必须将Shape(double w, double h)
更改为Shape(w, h)
。你实际上是在这里调用基础构造函数。
此外,您不必在派生类的构造函数体中设置width
和height
:
Rectangle(double w, double h) : Shape(w, h)
{}
就够了。这是因为在初始化列表中Shape(w, h)
将调用基类(shape
)的构造函数,它将为您设置这些值。
创建派生对象时,将执行以下操作:
Shape
的内存已预留在您的示例中,Shape
子对象由Shape(double w = 0, double h = 0, double r = 0)
初始化。在此过程中,基础部分(width
,height
,radius
)的所有成员都由基础构造函数初始化。在那之后,派生构造函数的主体被执行,但是你不必在这里改变任何东西,因为它们都是由基础构造函数处理的。
答案 1 :(得分:0)
几乎。而不是在这里重新声明参数:
Rectangle(double w, double h) : Shape(double w, double h)
你应该简单地“传递它们”(给出不准确的措辞):
Rectangle(double w, double h) : Shape(w, h)
{ }