将参数传递给超类构造函数
Passing arguments to a superclass constructor
我正在研究派生类,我正在研究著名的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)
更改为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
)的所有成员都由基类构造函数初始化。之后,执行派生构造函数的主体,但这里不需要更改任何内容,因为所有这些都由基构造函数处理。
差不多了。而不是在这里重新声明参数:
Rectangle(double w, double h) : Shape(double w, double h)
你应该简单地"pass them through"(给一个不准确的措辞):
Rectangle(double w, double h) : Shape(w, h)
{ }
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 参数包构造函数在类模板中隐藏用户定义的转换
- 具有已删除移动和复制构造函数的类的就地构造
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- C++构造函数和类?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 如何在其他类中使用参数化构造函数制作类的对象?
- 具有值包装器的可变参数模板构造函数的类构造函数优先级
- 如何使用私有构造函数对类进行单元测试?
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 从作为模板参数传递给构造函数的类继承,或者从它们继承
- 继承的构造函数忽略类内初始化
- 模板和隐式构造函数的类定义之外的友元声明
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- C++ - 从另一个类构造函数调用类构造函数
- 定义结构中没有默认构造函数的类
- 我可以将 std::move 与不提供 move 构造函数的类一起使用吗?
- 是否可以默认初始化具有已删除默认构造函数的类类型
- C++具有移动和复制构造函数的类中的代码重复
- 没有默认构造函数的类对象的值初始化