【问题标题】:Passing arguments to a superclass constructor将参数传递给超类构造函数
【发布时间】:2013-05-10 04:48:47
【问题描述】:

我刚刚进入派生类,我正在研究著名的Shape 类。 Shape 是基类,那么我有三个派生类:CircleRectangleSquareSquareRectangle 的派生类。我想我需要将派生类构造函数中的参数传递给基类构造函数,但我不确定该怎么做。我想在创建形状时设置它们的尺寸。这是我的基类和一个派生类:

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) 中的doubles,因为您实际上是在调用基类的构造函数。
  • 另外,考虑使用成员初始化器来初始化 Shape 的成员,而不是赋值,即让 Shape 构造函数看起来像这样:Shape(double w = 0, ...) : width(w), height(h), radius(r) {}
  • 通用形状的半径是什么意思?也许你需要重新考虑你的班级设计。

标签: c++ class inheritance constructor


【解决方案1】:

您必须将Shape(double w, double h) 更改为Shape(w, h)。您实际上是在调用这里的基本构造函数。

另外,你不必在派生类的构造函数体中设置widthheight

  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) 初始化。在这个过程中,基础部分的所有成员(widthheightradius)都被基础构造函数初始化。之后,派生构造函数的主体被执行,但您不必在此处更改任何内容,因为它们都由基构造函数处理。

【讨论】:

  • Shape 构造函数的主体?那它可以是空的吗?
  • @user2302335 我的意思是 Rectangle 构造函数的主体。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 2019-03-18
    • 1970-01-01
    • 2023-04-04
    • 2015-10-11
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多