基类和派生类的构造函数
2015-12-16 00:17
225 查看
原文地址:http://www.cnblogs.com/krisdy/archive/2009/06/11/1501390.html
当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象。当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数。简而言之,就是说,构造函数:基类->派生类。析构函数:派生类->基类。
这个我们完全可以通过一个小程序来说明:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A(Based Class) constructor is called"<<endl;
}
~A()
{
cout<<"A(Based Class) destructor is called"<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<"B(Derived Class) constructor is called"<<endl;
}
~B()
{
cout<<"B(Derived Class) destructor is called"<<endl;
}
};
int main()
{
B b1;
return 0;
}
通过派生类的构造函数调用基类的构造函数有两种方式,隐式和显式两种。所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数,这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造函数)。而所谓显式方式,就是在派生类的构造函数中指定要调用的基类的构造函数,并将派生类构造函数的部分参数值传递给基类构造函数。注:除非基类有默认的构造函数,否则必须采用显式调用方式。
下面分别给出一个隐式和显式调用的例子:
#include <iostream>
using namespace std;
class A
{
public:
A(int x = 0,int y = 0)
{
a = x;
b = y;
}
private:
int a;
int b;
};
//基类A有默认的构造函数,可以隐式调用
class B:public A
{
public:
B(int z = 0)
{
c = z;
}
private:
int c;
};
int main()
{
B b1;
return 0;
}
当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象。当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数。简而言之,就是说,构造函数:基类->派生类。析构函数:派生类->基类。
这个我们完全可以通过一个小程序来说明:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A(Based Class) constructor is called"<<endl;
}
~A()
{
cout<<"A(Based Class) destructor is called"<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<"B(Derived Class) constructor is called"<<endl;
}
~B()
{
cout<<"B(Derived Class) destructor is called"<<endl;
}
};
int main()
{
B b1;
return 0;
}
通过派生类的构造函数调用基类的构造函数有两种方式,隐式和显式两种。所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数,这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造函数)。而所谓显式方式,就是在派生类的构造函数中指定要调用的基类的构造函数,并将派生类构造函数的部分参数值传递给基类构造函数。注:除非基类有默认的构造函数,否则必须采用显式调用方式。
下面分别给出一个隐式和显式调用的例子:
#include <iostream>
using namespace std;
class A
{
public:
A(int x = 0,int y = 0)
{
a = x;
b = y;
}
private:
int a;
int b;
};
//基类A有默认的构造函数,可以隐式调用
class B:public A
{
public:
B(int z = 0)
{
c = z;
}
private:
int c;
};
int main()
{
B b1;
return 0;
}
#include <iostream> using namespace std; class A { public: A(int x,int y) { a = x; b = y; } private: int a; int b; }; //基类A没有默认的构造函数,其现有的构造函数需要传递参数,通过 //派生类构造函数调用A构造函数时必须如下显式调用 class B:public A { public: B(int x,int y,int z):A(x,y) { c = z; } private: int c; }; int main() { B b1(1,2,3); return 0; }
相关文章推荐
- HDU 3926 Hand in Hand(判断同构)
- Java回炉之IO流(二)使用规律
- Java @SuppressWarnings
- 用IDEA打成可执行jar包时遇到的问题
- Pascal triangle (杨辉三角)制表符
- 浅析字符串操作方法slice、substr、substring及其IE兼容性
- Android图文详解属性动画
- ES6个人学习整理(三)——解构赋值
- hdu1069 Monkey and Banana
- MAC 上 mysql 的编码设置
- STL_2: 模板_2_函数模板
- android-Hardware Acceleration
- hdu 1301 Jungle Roads (最小生成树)
- React 万能的函数表达式
- 使用Promise解决多层异步调用的简单学习
- An Important Pointer Concept
- strcpy,strcmp,strcat,strlen的实现以及大概介绍(下)
- Java 不定长度参数
- java设计优化--装饰者模式
- oracle ora-00054:resource busy and acquire with nowait specified解决方法