2

我刚刚进入派生类,并且正在研究著名的Shape类。Shape是基类,那么我有三个派生类:CircleRectangleSquare. 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",在每个派生构造函数中。

4

2 回答 2

3

您必须更改Shape(double w, double h)Shape(w, h). 您实际上是在此处调用基本构造函数。

此外,您不必在派生类的构造函数主体中设置width和:height

  Rectangle(double w, double h) : Shape(w, h)
  {}

足够的。这是因为在您的初始化列表Shape(w, h)中将调用基类 ( shape) 的构造函数,它将为您设置这些值。

创建派生对象时,将执行以下操作:

  1. 内存Shape被搁置
  2. 调用适当的 Base 构造函数
  3. 初始化列表初始化变量
  4. 构造函数的主体执行
  5. 控制权返回给调用者

在您的示例中,Shape子对象由Shape(double w = 0, double h = 0, double r = 0). 在这个过程中,基础部分的所有成员(width, height, radius)都由基础构造函数初始化。之后,派生构造函数的主体被执行,但您不必在此处更改任何内容,因为它们都由基构造函数处理。

于 2013-05-10T04:50:36.293 回答
0

几乎。而不是在这里重新声明参数:

Rectangle(double w, double h) : Shape(double w, double h)

您应该简单地“通过它们”(给出不准确的措辞):

Rectangle(double w, double h) : Shape(w, h)
{ }
于 2013-05-10T04:52:34.610 回答