C++中构造函数是一个比较特殊的函数,今天就从C++继承的角度来讲讲构造函数的一些知识。
大家都知道C++子类在构造对象的时候会去调用构造函数,根据构造对象传递参数的形式调用相应的构造函数,而构造函数首先会去调用基类的构造函数,那么具体调用基类的哪一个构造函数呢,如果是在子类的构造函数中没有具体指明的情况下,会去调用基类的构造函数,就是不传递参数的构造函数,这里不传递参数的构造函数就有两种情况了:
一是:基类的构造函数本身不需要传递参数,如当我们没有写基类的构造函数的时候编译器会给我们提供一个无参的构造函数,只是这个构造函数什么都不做而已。一旦我们在基类里面定义了构造函数,无论是有参数的还是无参数的,编译器都不会提供构造函数。
二是:我们自己在基类定义了构造函数,但是这个构造函数都有默认的参数值,可以不需要传递参数,所以这两种情况,其实子类只是去调用不传递参数的构造函数而已,至于具体是无参的构造函数还是参数都有默认值的构造函数就不管了,当然如果基类里面既有无参的构造函数,又有参数都带有默认值的构造函数的时候,编译器编译的时候就会出错了。
具体的例子就是MFC中CWinApp的类的构造函数,有一个参数,参数有一个默认值,我们在编写应用程序的时候从CWinApp继承来的类CTestApp根本就没有编写过构造函数,那么这时编译器会提供一个默认的构造函数,而且这个默认的构造函数会调用基类的不需要传递参数构造函数,因此这样就将我们的应用程序与MFC框架进行了很好的绑定,因此我们我们的应用程序才能够应用MFC框架。
在类的构造函数中可以为一个全局变量进行复制,MFC就是采用了这样的一种方法,模拟MFC中的CWinApp的部分代码如下:
#include<iostream>
using namespace std;
class Animal; //申明一个类.
Animal *animal; //定义一个类对象的指针.
Animal *GetAnimal()
{
return animal;
}
class Animal
{
public:
Animal(int a=5)
{
cout<<"带有默认参数值的动物构造函数\n";
animal=this; //为全局变量赋值.
}
virtual void output()
{
cout<<"动物的输出方法被调用\n";
}
};
class Fish:Animal
{
public:
Fish()
{
cout<<"鱼的构造函数\n";
}
virtual void output()
{
cout<<"鱼的输出方法被调用.\n";
}
};
int main()
{
Fish f;
GetAnimal()->output();
return 0;
}