zoukankan      html  css  js  c++  java
  • 继承构造函数的执行顺序

    转自:http://blog.csdn.net/daheiantian/article/details/6438782

    Code:

    #include <iostream>
    using namespace std;
    
    class A {
    public:
    A() {
    cout<<"int A::A()"<<endl;
    }
    A(A &a) {
    cout<<"int A::A(A &a)"<<endl;
    }
    A& operator=(A& a) {
    cout<<"int A::operator=(A &a)"<<endl;
    return a;
    }
    virtual ~A() {
    cout<<"int A::~A()"<<endl;
    }
    };
    
    class M :public A {
    public:
    M() {
    cout<<"int M::M()"<<endl;
    }
    M(M &a) {
    cout<<"int M::M(M &a)"<<endl;
    }
    M& operator=(M& m) {
    cout<<"int M::operator=(M &a)"<<endl;
    return m;
    }
    virtual ~M() {
    cout<<"int M::~M()"<<endl;
    }
    };
    
    class B:virtual public M {
    public:
    B() {
    cout<<"int B::B()"<<endl;
    }
    B(B &a) {
    cout<<"int B::B(B &a)"<<endl;
    }
    B& operator=(B& b) {
    cout<<"int B::operator=(B &a)"<<endl;
    return b;
    }
    virtual ~B() {
    cout<<"int B::~B()"<<endl;
    }
    
    };
    
    class N :public A {
    public:
    N() {
    cout<<"int N::N()"<<endl;
    }
    N(N &a) {
    cout<<"int N::N(N &a)"<<endl;
    }
    N& operator=(N& n) {
    cout<<"int N::operator=(N &a)"<<endl;
    return n;
    }
    virtual ~N() {
    cout<<"int N::~N()"<<endl;
    }
    };
    class C:virtual public N {
    public:
    C() {
    cout<<"int C::C()"<<endl;
    }
    C(C &a) {
    cout<<"int C::C(C &a)"<<endl;
    }
    C& operator=(C& c) {
    cout<<"int C::operator=(C &a)"<<endl;
    return c;
    }
    virtual ~C() {
    cout<<"int C::~C()"<<endl;
    }
    };
    class E:virtual public M{
    public:
    E() {
    cout<<"int E::E()"<<endl;
    }
    E(E &a) {
    cout<<"int E::E(E &a)"<<endl;
    }
    E& operator=(E& e) {
    cout<<"int E::operator=(E &a)"<<endl;
    return e;
    }
    virtual ~E() {
    cout<<"int E::~E()"<<endl;
    }
    };
    class D:public B, public C, public E {
    public:
    D() {
    cout<<"int D::D()"<<endl;
    }
    D(D &a) {
    cout<<"int D::D(D &a)"<<endl;
    }
    D& operator=(D& d) {
    cout<<"int D::operator=(D &a)"<<endl;
    return d;
    }
    virtual ~D() {
    cout<<"int D::~D()"<<endl;
    }
    };
    
    
    int main(int argc, char **argv) {
    cout<<"-------构造函数-------"<<endl;
    D d;
    cout<<"-------复制构造函数-------"<<endl;
    D d1(d);
    cout<<"-------赋值操作符-------"<<endl;
    d = d1;
    cout<<"-------析构函数-------"<<endl;
    
    
    return 0;
    }

    Result:

    -------构造函数-------
    int A::A()
    int M::M()//构造虚基类M时,要先构造其父类A
    int A::A()
    int N::N()//和M一样,构造虚基类N时,也要先构造其父类A
    int B::B()//构造完虚基类,开始构造直接父类,按照声明顺序为B、C、E
    int C::C()
    int E::E()
    int D::D()//最后构造自己
    -------复制构造函数-------
    int A::A()
    int M::M()
    int A::A()
    int N::N()
    int B::B()
    int C::C()
    int E::E()
    int D::D(D &a)//因为D中定义了复制构造函数,并且没有显式调用父类的构造函数,所以所有的“虚基类”和“直接父类”都调用默认构造函数
    -------赋值操作符-------
    int D::operator=(D &a) //因为显式调用了赋值操作符,那么就只调用自己的代码,不会隐式调用其它的函数
    -------析构函数-------
    int D::~D()
    int E::~E()
    int C::~C()
    int B::~B()
    int N::~N()
    int A::~A()
    int M::~M()
    int A::~A()//因为main函数中定义了两个D对象,所以main函数结束时要进行析构两个D对象。析构的顺序与 构造函数相反。
    int D::~D()
    int E::~E()
    int C::~C()
    int B::~B()
    int N::~N()
    int A::~A()
    int M::~M()
    int A::~A()
    
    Press any key to continue.
  • 相关阅读:
    C++指针与引用类型的区别
    Linux介绍和基本操作
    CMD 命令
    C语言关键字
    错误: 在类中找不到 main 方法, 请将 main 方法定义为: &#160; &#160;public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application 。
    根据补码定义,由真值求补码。
    域名直接访问项目|Tomcat http 自动跳转Https
    Python扩展库NumPy快速入门
    项目慢查询性能分析
    Springboot 配置 https
  • 原文地址:https://www.cnblogs.com/anit/p/3917024.html
Copyright © 2011-2022 走看看