基类与派生类的构造函数
来源:互联网 发布:java电商系统源码 编辑:程序博客网 时间:2024/06/18 14:46
转自http://www.quanxue.cn/JC_CLanguage/Cpp/Cpp08.html
一、缺省构造函数的调用关系
通过下面的例子,我们来看一下基类与派生的构造函数的调用顺序。创建时先基类后派生类。销毁时先派生类后基类。
#include <iostream>#include <string>using namespace std;class CBase { string name; int age;public: CBase() { cout << "BASE" << endl; } ~CBase() { cout << "~BASE" << endl; }};class CDerive : public CBase {public: CDerive() { cout << "DERIVE" << endl; } ~CDerive() { cout << "~DERIVE" << endl; }};int main ( ) { CDerive d; return 0;}
二、有参数时的传递
当有参数时,参数必须传送给基类。注意例子中传递的方法(第8行、第19行)。
#include <iostream>#include <string>using namespace std;class CBase { string name;public: CBase(string s) : name(s) { cout << "BASE: " << name << endl; } ~CBase() { cout << "~BASE" << endl; }};class CDerive : public CBase { int age;public: CDerive(string s, int a) : CBase(s), age(a) { cout << "DERIVE: " << age << endl; } ~CDerive() { cout << "~DERIVE" << endl; }};int main ( ) { CDerive d("小雅", 27); return 0;}
三、祖孙三代的参数传递
当有三层继承时,参数要一层一层地传递下去(第30行、第19行、第8行)。
#include <iostream>#include <string>using namespace std;class CBase { string name;public: CBase(string s) : name(s) { cout << "BASE: " << name << endl; } ~CBase() { cout << "~BASE" << endl; }};class CDerive : public CBase { int age;public: CDerive(string s, int a) : CBase(s), age(a) { cout << "DERIVE: " << age << endl; } ~CDerive() { cout << "~DERIVE" << endl; }};class CSon : public CDerive { string id;public: CSon(string s1, int a, string s2) : CDerive(s1, a), id(s2) { cout << "SON: " << id << endl; } ~CSon() { cout << "~SON" << endl; }};int main ( ) { CSon s("小雅", 27, "8503026"); return 0;}
四、多重继承的参数传递
多重继承时参数的传递方法和上面一样,要注意的是两个基类的顺序。决定2个基类的顺序是知27行。将27行的CBase1和CBase2的顺序交换一下,其结果中BASE1和BASE2的顺序也随之改变,与第30行无关。
#include <iostream>#include <string>using namespace std;class CBase1 { string name;public: CBase1(string s) : name(s) { cout << "BASE1: " << name << endl; } ~CBase1() { cout << "~BASE1" << endl; }};class CBase2 { int age;public: CBase2(int a) : age(a) { cout << "BASE2: " << age << endl; } ~CBase2() { cout << "~BASE2" << endl; }};class CDerive : public CBase1, public CBase2 { string id;public: CDerive(string s1, int a, string s2) : CBase1(s1), CBase2(a), id(s2) { cout << "DERIVE: " << id << endl; } ~CDerive() { cout << "~DERIVE" << endl; }};int main ( ) { CDerive d("小雅", 27, "8503026"); return 0;}
0 0
- 继承与派生:派生类的构造函数
- 继承与派生:虚基类及其派生类的构造函数
- 三十九、继承与派生:派生类的构造函数****
- 派生类与基类的构造函数
- 基类与派生类的构造函数
- 基类与派生类的构造函数
- 基类与派生类的构造函数调用问题
- C++派生类与基类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 十进制十六进制
- Javascript数组方法(译)
- libevent简单使用
- 游戏服务器之服务器之间的被动连接
- Ubuntu 12.04全局菜单开启和关闭
- 基类与派生类的构造函数
- 一个经验
- 传智学习日志篇:十三
- A powerful image downloading and caching library for Android
- ROC曲线
- Struts2 Action访问Web对象的四种方式
- hdu1729(博弈SG)
- Cracking the coding interview--Q4.2
- 九度oj 题目1450:产生冠军