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.
  • 相关阅读:
    完美配置Tomcat的HTTPS
    分享一个免费SSL证书申请网站,给网站开启https协议 | 张戈博客
    使用HttpClient发送HTTPS请求以及配置Tomcat支持SSL
    HttpClient工具类v1.7
    列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤
    拷贝一个目录或者文件到指定路径下
    判断字符是否属于中文
    Windows 7更改SVN账户密码
    FileObverse文件观察者的Debug报告
    jquery.cookie.js操作cookie实现“记住密码”,很简单很强大
  • 原文地址:https://www.cnblogs.com/anit/p/3917024.html
Copyright © 2011-2022 走看看