在使用new创建对象时,主要完成四项工作:
1 构造父类成员对象
2 构造子类成员对象
3 调用父类构造函数
4 调用子类构造函数
这四项工作的时间顺序是怎样的呢?
原则是:先父类后子类,先成员后函数
一级继承
例如:
class X{
public:
X(){cout<<"X";}
};
class A{
public:
X x1;
A(){cout<<"A";}
};
class B: public A{
public:
X x2;
B(){cout<<"B";}
};
int main(){
B b;
}
构造对象B时,根据第1个原则:先父类后子类,先构造A(1),然后构造B(2)。
构造A(1):
然后根据第2个原则,先成员后函数,先构造A的成员x1,即先调用X构造函数,然后再调用A构造函数
构造B(2):
根据第2个原则,先成员后函数,先构造B的成员x2,即先调用X构造函数,然后再调用B构造函数
因此输出为:
XAXB
多级继承
在一级继承中这个比较容易分析,在多级继承中就会复杂些,但坚持这两个原则,细心分析也不会出问题的。
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
class X{
public:
X(){cout<<"X";}
};
class Y{
public:
Y(){cout<<"Y";}
};
class A{
public:
A(){cout<<"A";}
~A(){cout<<"~A";}
};
class B: public A{
public:
Y x;
A a;
Y y;
B(){cout<<"B";}
~B(){cout<<"~B";}
};
class C: public B{
protected:
X x;
B b;
A a;
X y;
public:
C(){cout<<"C";}
~C(){cout<<"~C";}
};
int main(){
C *c = new C();
delete c;
}
这个程序的输出就比较复杂:
AYAYBXAYAYBAXC~C~A~B~A~A~B~A~A
开始分析:
先父类后子类,所以先构造B(1),然后构造C(2)
构造B(1)的过程如下:
也是先构造A(1.1),然后构造B(1.2)
构造A(1.1)的过程如下:
调用A的构造函数,输出A(第一个输出字符)
构造B(1.2)的过程如下:
先成员(1.2.1)后构造(1.2.2),
成员(1.2.1)的过程如下:
B的成员有Y,A,Y,所以构造Y,A,Y,输出YAY(第二到四个字符)
构造(1.2.2)的过程如下:
B的构造函数,输出B(第五个字符)
所以构造B一共会输出YAYB四个字符
构造C(2)的过程如下:
先成员(2.1)后构造(2.2)
成员(2.1)的过程如下:
C的成员有XBAX
所以构造X,输出X(第六个字符)
构造B输出AYAYB(第七到十一个字符)
构造A输出A(第十二个字符)
构造X输出X(第十三个字符)
构造(2.2)
输出C(第十四个字符)
最后按照完全相反的顺序调用析构函数
来自http://hankjin.blog.163.com/blog/static/33731937201010633157934/
相关推荐
调用父类构造函数,对应文件:ClassElement2,文章:https://blog.csdn.net/yysyangyangyangshan/article/details/84311848
在本文里我们给大家分享一篇关于Python 子类继承父类构造函数的相关知识点内容,需要的朋友们跟着学习下。
问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使...
主要介绍了C++类继承之子类调用父类的构造函数的实例详解的相关资料,希望通过本文大家能够掌握C++类继承的相关知识,需要的朋友可以参考下
如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。 构造原则如下: 1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。 ...
主要介绍了c++ 子类构造函数初始化及父类构造初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文实例讲述了Python实现子类调用父类的方法。分享给大家供大家参考。具体实现方法如下: ...如果子类和父类都有构造函数,子类其实是重写了父类的构造函数,如果不显式调用父类构造函数,父类的构造
《Visual C++2012入门经典(第6版)》实例,在派生类的构造函数中调用基类的构造函数
java中的继承(子类调用父类构造方法还不懂).doc
举例说明构造函数的调用过程,定义类及其派生类,构造函数对类成员初始化
C++\测试 对象成员构造函数、基类构造函数、派生类本身的构造函数 的先后顺序.rar
声明一个带参数的构造函数,该构造函数继承基类base中的带参数的构造函数
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication6 { public class employee { #region ...
其中,构造函数在定义对象时被调用,析构函数在对象释放时被调用。如果用户没有提供构造函数和析构函数,系统将提供默认的构造函数和析构函数。 1.构造函数 构造函数是一个与类同名的方法,可以没有参数,有一个参数...
面向对象程序设计,即C++语言,类。构造函数的显示调用+构造函数的重载,文件里面有详细的注释。
创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数...
java训练题目 编写程序实现子类对父类构造方法的引用?
主要介绍了Java序列化中子类、父类构造函数问题,结合实例形式分析了java父类与子类构造函数中序列化接口调用相关操作技巧与使用注意事项,需要的朋友可以参考下