首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++继承:子类实例同时使用子构造函数和父构造函数。

C++继承:子类实例同时使用子构造函数和父构造函数。
EN

Stack Overflow用户
提问于 2015-08-14 21:03:03
回答 2查看 1.8K关注 0票数 0

我正在c++中练习继承,我遇到了一些构造函数问题。

当我创建子类(循环)的实例时,它会同时创建子类和父类的实例。或者是真的?

我只想创建一个圆形的实例,而不是形状和圆圈。

如果从圆圈的构造函数中删除: for (0,0),则会得到错误:“类形状不存在默认构造函数”

你总是必须引用父母的构造函数吗?这意味着父构造函数总是被调用?这是否意味着有一个孩子和父母的实例?

儿童班:

代码语言:javascript
复制
#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);
}

父包:

代码语言:javascript
复制
#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;
}

主要包装:

代码语言:javascript
复制
#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 完成

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-14 21:48:20

在我看来,您的代码没有问题,您只是对继承在C++中的工作方式感到困惑。

每次从基类派生类时,在输入子类构造函数之前,如果基类构造函数没有参数,编译器将自动为您调用基类构造函数。例如,如果您的Shape类具有如下构造函数

代码语言:javascript
复制
Shape::Shape(){ }

这样,子类就不必调用初始化列表中的基类构造函数(编译器会为您这样做)。现在,构造函数可以如下所示:

代码语言:javascript
复制
Circle::Circle(float radius) {
   this->radius = radius;
}

如果没有没有参数的构造函数,则必须在初始化列表中显式调用它。

圆型的每个物体都是一种形状,里面有更多的信息。这并不意味着编译器只因为初始化父组件而创建两个对象,您仍然有一个对象。

现在,如果您希望您的圆圈与您的形状对象不同,那么您不再需要继承了。(虽然我认为这不是你想要的)

您不能/不想避免调用基类构造函数,这就是继承的全部要点:它允许您扩展一个对象的特性,这是基于另一个对象的实现的。

票数 0
EN

Stack Overflow用户

发布于 2015-08-14 21:41:33

我认为你混淆了术语。也就是说,您将父类(它是角色)与基类混淆。

如果一个圆是一个形状,那么当然,通过创建一个圆,你也会创建一个形状,因为这个圆圈是一个形状。这是不可避免的,是完全正确的。但是形状不会是一个额外的物体,它将包含在圆圈中,它是它不可分割的一部分。

你总是必须引用父母的构造函数吗?

通常情况下,如果您有一个默认构造函数,无论是没有参数的构造函数还是参数默认值的构造函数,您都可以省略它并隐式地获得默认构造函数。但是由于Shape只有一个接受参数的构造函数,所以必须指定它。一个圆是一个形状,所以在你有一个圆之前,你必须有一个形状。

如果将构造函数更改为Shape::Shape(float base = 0.0, float height = 0.0),则可以从派生类的初始化列表中省略它。

父类与基类完全不同,父-子关系是关于所有权的,例如,在确定性垃圾收集的情况下,当子级的生存期与父类的生存期相关联时。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32018607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档