当前位置:鱼C工作室 >C++ > 查看文章

继承机制中的构造器和析构器 – C++快速入门17

继承机制中的构造器和析构器

 

让编程改变世界

Change the world by program


 

继承机制中的构造器和析构器

 

正如此前所讲解的,C++ 支持程序员自己写出将创建或销毁一个对象时自动调用的方法,也就是构造器和析构器。

在没有继承机制的情况下,我们很容易理解这些方法在创建或销毁一个对象的时候被调用。但是一旦使用了继承机制,构造器和析构器就变得有点复杂了。

 

比如基类有个构造器,如Animal(),它将在创造 Pig 类型的对象时最先被调用,如果 Pig 类也有一个构造器,它将排在第二个被调用。

因为基类必须在子类之前初始化原则!

 

然后我们继续讨论:如果构造器带着输入参数,事情变得稍微复杂了。

class Animal

{

public:

Animal( std::string theName );

std::string name;

}

class Pig : public Animal

{

public:

Pig( std::string theName );

}

 

那么我们的方法应该如何定义呢?

不卖关子误导大家(小甲鱼发现,有时候跟大家说不能这样,要这样,但是大家却常把”不能这样”当”要这样”写了),应该如此定义:

Animal::Animal( std::string theName )

{

name = theName;

}

Pig::Pig( std::string theName ) : Animal( theName )

{

}

 

注意在子类的构造器定义里的”:Animal(theName)”语法含义是:

当调用 Pig() 构造器时(以 theName 作为输入参数),Animal()构造器也将被调用( theName 输入参数将传递给它)。

于是,当我们调用 Pig pig(“小猪猪”); 将把字符串 “小猪猪” 传递给 Pig() 和 Animal(),赋值动作将实际发生在 Animal() 方法里。

 

实践:test2(源代码下载

 

在销毁某个对象时,基类的析构器也将被自动调用,但这些事情编译器会自动替你处理。

因为析构器不需要输入参数,所以根本用不着使用 :SuperClassMethod(arguments) 语法!

与构造器的情况相反,基类的析构器将在子类的最后一条语句执行完毕后才被调用。

为了让大家对上面介绍的执行流程有比较直观的印象,我们来编写一个小程序:example(源代码下载

 

新手需要注意的地方

 

初学者常犯的一种错误是用一个毫不相干的类去派生另一个毫不相干的子类。

例如就有人在 Human 类里有一个 swim() 方法,当这哥们在设计一条鱼的时候,就用 Human 去派生一个 Fish 类。

从技术角度讲,这麽做没有问题,但像这样的运用继承机制实在太牵强附会了。。。

作为一条基本原则,基类和子类之间的关系应该自然和清晰!

 

题外话:图像小甲鱼发觉上帝也懂编程,创造出”美人鱼” 就是这么个意外导致的。。。。。。

 

关于构造器的设计要越简明越好!我们应该只用它来初始化各种有关的属性。

作为一个基本原则,在设计、定义和使用一个类的时候,应该让它的每个组成部分简单到不能再简单!

最后一点别忘了,析构器的基本用途是对前面所做的事情进行清理。尤其是在使用了动态内存的程序里,析构器将至关重要!


为您推荐

报歉!评论已关闭.