继承和构造函数
Inheritance and Constructors
这不是家庭作业,只是我C++课的一些训练练习,以便习惯遗传和其他东西。因此,练习的第一部分要求我们创建一个具有一个类名 Rectangle 的程序,我们应该做构造函数 getter 和 setter,并找到面积和周长。这部分工作正常。练习的第二部分说创建一个新的类名 Square,它扩展了 Rectangle,并且有一个构造函数,该构造函数将具有正方形的宽度作为参数。然后程序应打印区域和周长。
#include <iostream>
using namespace std;
class Rectangular {
private:
int width;
int height;
public:
Rectangular () {
width = 5;
height = 5;
}
Rectangular (int w, int h) {
width = w;
height = h;
}
void setWidth (int w) {
width = w;
}
void setHeight (int h) {
height = h;
}
int getWidth () {
return width;
}
int getHeight () {
return height;
}
int getArea () {
return width*height;
}
int getPerimeter () {
return width+height;
}
};
class Square : public Rectangular{
public:
Square (int w) {
getWidth();
}
};
int main(int argc,char *argv[])
{
Rectangular a, b(10,12);
Square c(5);
cout << "Width for a: " << a.getArea() << " Perimeter for a: " << a.getPerimeter() << endl;
cout << "Width for b: " << b.getArea() << " Perimeter for b: " << b.getPerimeter() << endl;
cout << "Area for c: " << c.getArea() << " Perimeter for c: " << c.getPerimeter() << endl;
}
程序打印出来
Width for a: 25 Perimeter for a: 10
Width for b: 120 Perimeter for b: 22
Area for c: 25 Perimeter for c: 10
出于某种原因,c 得到 a 的值。 有什么想法吗?
您忘记链接构造函数 Square
.您希望将 Square
的构造函数更改为:
Square(int w) : Rectangle(w,w) {}
您的a
没有在其构造函数中定义任何值,因此其为5x5。您为c
指定的相同(您在此处也没有定义初始宽度/高度 - 请注意,您不调用任何特定的 Rectangular
构造函数,因此使用默认值(。因此,它不是"从中获取值",而是简单地以相同的方式初始化。
类Square
中的构造函数应该是:
Square(int w) : Rectangular (w, w)
{
/* do what ever */
getWidth();
}
getWidth ()
调用有什么用? 删除它。
编辑1 :
注:cout<<"Width for a: "<<a.getArea()<<" Perimeter for a: "<<a.getPerimeter()<<endl;
您已经写了"Width for a: "
但实际上已经打印了该区域,通过调用a.get_Area ();
正在发生的事情是,b 是用你设置的width
和height
创建的(相应地是 10 和 12(,默认情况下使用 5 和 5 创建 a。如果你看一下,你的Square
是使用默认构造函数创建的,由于你的getWidth()
调用(以及整体(创建了一个父实例(使用它的默认构造函数(,将其设置为 5 对 5。因此,你得到相同的a和c。
这个练习实际上是错误使用继承:)的一个很好的例子虽然在数学上正方形总是一个矩形,但当您尝试用C++建模时,可能会很棘手。
示例:LuxuryCar
的实例始终可以在预期Car
的地方使用;但是不能总是使用 Square
代替Rectangle
(例如此窗口(。
为了在您的实现中说明这一点 - 您的 Square
继承了 setWidth
和 setHeight
方法。如果你在一个正方形上使用它们,你就会打破它——它不再是一个正方形了。因此,您需要覆盖它们,以便保持正方形的约束。但如果你这样做,我不确定你从Rectangle
继承有什么收获.此外,Square
提供了一个与其性质不一致的API(方法集((显然没有平方宽度(。
- 具有相同名称的类的构造函数继承
- 多复制构造函数继承中的惊人行为
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 无法从 c++ 中的构造函数继承
- 在构造函数继承中使用默认构造函数
- 构造函数继承和直接成员初始化
- C++ - 使用私有参数的构造函数继承
- 通过可变参数模板进行C++11构造函数继承
- C++11构造函数继承和不带参数的构造函数
- C++11 - 构造函数继承
- C++构造函数继承
- 使用 C++11 编译器的构造函数继承正在生成错误
- 选择性构造函数继承"Ambiguous resolution"错误
- 什么是构造函数继承
- C++对象中的构造函数继承与方法继承
- C++构造函数继承没有匹配的函数
- C++构造函数继承(从派生类调用构造函数)
- 模板构造函数继承的标准符合语法是什么
- C++构造函数继承错误