C++继承後的构造函数与结构函数

  次阅读 作者:智能小宝 来源:互联网 2016-01-26 10:33 我要评论(0)

若您继承了某个类别之后,当您在生成衍生类别的物件时若不指定参数,无参数的预设建构子会被执行,而基础类别的无参数预设建构子也会被执行,所以基于这种特性,通常预设建构子中会撰写一些通用的成员状态初始,例如设定一些预设值。

如果继承之后,您要使用衍生类别生成物件,在生成物件时指定参数,并同时执行基底类别中的某个参数建构子,您可以使用 : 运算子

例如:

// Point2D类别

class Point2D {

public:

Point2D() {

_x = 0;

_y = 0;

}

Point2D(int x, int y) : _x(x), _y(y) {

}

private:

int _x;

int _y;

};

// Point3D类别

class Point3D : public Point2D { // 继承Point2D类别

public:

Point3D() {

_z = 0;

}

// 建构函式,同时指定呼叫父类别建构函式

Point3D(int x, int y, int z) : Point2D(x, y), _z(z) {

}

private:

int _z; // 新增私用资料

};

如果您使用衍生类别生成物件,则建构函式的执行顺序会从基底类别的建构函式开始执行起,这是可以理解的,因为基底类别是衍生类别的基础,一些基础的参数或初始状态必须先完成,再来再完成衍生类别中的建构函式。

而在物件被消灭时,解构函式的执行顺序则正好相反,是从衍生类别的解构函式开始执行,再来才是基础类别的建构函式,因为若基底类别的解构函式如果先执行,则衍生类别相依于基底类别的一些状态也会被解构(例如指标),则此时再行衍生类别的解构函式,将存在着相依问题而造成错误。

下面这个简单的程式可以告诉您建构函式与解构函式,在继承之后的执行顺序:

#include using namespace std; class Foo1 { public:

Foo1() {

cout << "Foo1建构函式" << endl;

}

~Foo1()

{

cout << "Foo1解构函式" << endl;

}

};

class Foo2 : public Foo1 { public:

Foo2() {

cout << "Foo2建构函式" << endl;

}

~Foo2() {

cout << "Foo2解构函式" << endl;

}

};

int main()

{

Foo2 f;

cout << endl;

return 0;

}

执行结果:

Foo1建构函式

Foo2建构函式

Foo2解构函式

Foo1解构函式

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...