子类构造、析构时调用父类的构造、析构函数顺序

析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了。

定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。

原因:

  1. 派生类构造函数中的某些初始化可能是基于基类的,所以规定构造在类层次的最根处开始,而在每一层,首先调用基类构造函数,然后调用成员对象构造函数(因为C++的成员变量是不会自动初始化的,只能使用初始化列表初始化(调用成员的构造函数)或在本层构造函数内初始化          参考:http://www.cnblogs.com/lidabo/p/3790606.html)。
  2. 如果没有显式调用基类的构造函数,会自动调用基类的无参构造函数。而如果基类只有带参数的构造函数,则会报错。不一定要显式的无参构造函数,可以显式调用基类带参数的构造函数。
#include<iostream>
using namespace std;
class Base{
public:
    Base(int c){cout<< "基类带参构造函数" << c << endl;}
    ~Base(){cout<<"基类析构" << endl;}
};
class Derived:public Base{
public:
    Derived(int c):Base(c) // 显式调用基类构造函数
    {
        cout<< "派生类带参构造函数" << c << endl;
    }
    ~Derived(){cout<<"派生类析构" << endl;}
};
int main()
{
    int i = 9;
    Derived d1(i);
    return 0;
}

输出结果:

基类带参构造函数9

派生类带参构造函数9

派生类析构

基类析构

转自:http://zhidao.baidu.com/link?url=fdBaMWX2-7zCBRQDow9LtkNGa9rRnvz6rhybNxvRc1tP8Puhx4HeKPfrdLHETk3DyFjnSHDvhA1daydeTc0x4RF0458i_r_rOWFoH3N5JcG

时间: 2024-11-03 03:31:59

子类构造、析构时调用父类的构造、析构函数顺序的相关文章

子类构造函数会默认调用父类无参构造函数

1.调用父类无参构造函数是默认的! 子类的构造方法默认都去访问了父类的无参构造方法:在子类中的构造方法后都有一行默认语句 base() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Fu {   public Fu()     {         Console.WriteLine("fu");     } } class Zi : Fu {     public Zi()         : base()//不管是否显式调用,控制台都会输出fu

关于子类对象的构造函数和父类构造函数的执行顺序

我们分别为父类和子类添加显式的构造函数,代码如下: class Person     {         private int nAge;         protected string strName;         double douHeight;         public string strEateType;         //父类的构造函数         public Person()         {             Console.WriteLine("我

java创建一个子类对象是会调用父类的构造方法会不会创建父类

1.子类在创建实例后,类初始化方法会调用父类的初始化方法(除了Java.lang.Object类,因为java.lang.Object类没有父类),而这种调用会逐级追述,直到java.lang.Object的初始化方法.这个地方我说的是初始化方法,而不是构造方法,因为构造方法是相对于java源程序而言,而编译后的class文件是初始化方法即" <init>"方法(红色部分为方法名),初始化方法是由java源程序的三个部分组成的,一个部分是成员字段后的直接的初始化语句,例如p

c++ 子类要正确的调用父类构造函数

class base{ public: int i,j; base(){ i=j=0; } base(int a,int b){ i=a;j=b; } }; class deried:public base{ public: deried(int a,int b){ base(a,b); } }; int main(){ deried d(3,1); cout<<d.i<<" "<<d.j<<endl; return 0; } 上面的这段

为什么在新建子类时要先调用父类的构造器

子类构造器会默认调用 父类的无参构造器,如果父类没有无参构造器,则需在子类构造器的第一行显式地调用父类的其他构造器. 其次,从继承的思想来看,你继承一个类,就相当于扩展一个类,形成一个更为特殊的类,但经常,我们需要将子类向上转型为基类,以便使用或达到其他各种目的. 这时,如果你生成子类对象时没有调用父类的构造器,那么,我们在使用父类的一些成员变量的时候,就会报变量未初始化的错误.请记住,变量初始化总是在构造器调用之前完成! 构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量.子类拥有父

java基础 super 子类调用父类

如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 example如下: package test; /* * 如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 * */ public class test4 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Kkk kk = new Kkk(12,"dd");

子类调用父类的构造函数

当子类在声明对象实例时,想显式调用父类的有参构函数.注意:不能在构造函数中直接调用父类的构造函数,否则会调用两次.应该通过参数列表来调用.代码如下: class?MyClassA//父类 { public: MyClassA(?CString?str?) { AfxMessageBox(str); } ~MyClassA() { } private: }; class?MyClassB:public?MyClassA//子类 { public: MyClassB():MyClassA(_T("子

Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法

public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); printB(); } public void printB(){ System.out.print("SuperClass-printB"); } } public class ChildClass extends SuperClass{ public void printA(){ System

C++调用父类的构造函数规则

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法).因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法. 如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建. 构造原则如下: 1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法. 2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,