继承机制中的构造器和析构器
让编程改变世界
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(源代码下载)