【发布时间】:2015-08-14 21:03:03
【问题描述】:
我正在练习 C++ 中的继承,但遇到了一些构造函数问题。
当我创建子类 (Circle) 的实例时,它会同时创建子类和父类的实例。还是这样?
我只想创建一个 Circle 的实例,而不是 shape 和 circle。
如果我从 Circle 的构造函数中删除 : Shape(0,0),则会收到错误消息:“Shape 类不存在默认构造函数”
你总是要引用父类的构造函数吗?这意味着总是调用父级的构造函数?这是否意味着同时存在子实例和父实例?
儿童班:
#include "Circle.h"
#include <iostream>
using namespace std;
Circle::Circle(float radius) : Shape(0.0, 0.0) {
this->radius = radius;
}
float Circle::computeArea() {
cout << "Circle area is " << (3.14 * radius * radius) << "\n";
return float(3.14 * radius * radius);
}
父包:
#include "Shape.h"
#include <iostream>
using namespace std;
Shape::Shape(float base, float height) {
this->base = base;
this->height = height;
cout << "Shape: base - " << base << " height - " << height << "\n";
}
float Shape::computeArea() {
cout << "Area is " << base*height << "\n";
return base * height;
}
主包:
#include "Circle.h"
#include "Square.h"
#include <iostream>
using namespace std;
int main() {
Square mySquare(10.0, 10.0);
Circle myCircle(5.0);
float squareArea = mySquare.computeArea();
float circleArea = myCircle.computeArea();
cout << "done";
return 0;
}
输出:
形状:底 - 10 高度 - 10
形状:底 - 0 高度 - 0
面积为 100
圆形面积为 78.5
完成了
【问题讨论】:
-
那么问题是什么?
-
如果您对
Shape的构造函数被调用感到惊讶,那么您认为您在这里做什么:Circle::Circle(float radius) : Shape(0.0, 0.0)? (派生类是(也是)一个父类,并且必须构建自身的“父”部分,因此在其构造函数中调用其构造函数) -
那么当从父级继承时,你总是和子级一起创建父级的实例?
-
@Spectrem 不,有一个实例,但它既是形状又是圆形,因为圆形是形状。所以这个单一实例也将运行 Shape 和 Circle 构造函数。但是,您可以在 Shape 中定义多个构造函数,并从 Circle 构造函数中选择要运行的构造函数。但是,这可能会让阅读您的代码的其他人更难理解。
-
Wimmel,将你的答案发布为我的问题的答案,以便我选择它。
标签: c++ inheritance