【c++编程思想】多重继承

 

  • 虚基类
 

因为虚基类引起共享子对象,共享发生之前他们就应该存在才会有意义。所以子对象的初始化顺序遵循如下的规则递归的进行:

1)所有虚基类子对象,按照他们出现的位置,从上到下从左到右初始化。
2)然后非虚基类按照通常顺序初始化
3)所有的成员对象按照声明的顺序初始化
4)完整的对象构造函数执行。
 
#include<iostream>
#include<string>
using namespace std;

class M
{
    public:
    M(const string &s){
        cout<<"M constructure "<<s<<endl;
    }
};

class A
{
    M m;
    public:
    A(const string &s):m("in A"){
        cout<<"A "<<s<<endl;
    }
    virtual ~A(){}
};

class B
{
    M m;
    public:
    B(const string &s):m("in B"){
        cout<<"B "<<s<<endl;
    }
    virtual ~B(){}
};

class C
{
    M m;
    public:
    C(const string &s):m("in C"){
        cout<<"C "<<s<<endl;
    }
    virtual ~C(){}
};

class D
{
    M m;
    public:
    D(const string &s):m("in D"){
        cout<<"D "<<s<<endl;
    }
    virtual ~D(){}
};

class E:public A, virtual public B, virtual public C
{
    M m;
    public:
    E(const string& s):A("from E"), B("from E"), C("from E"), m("in E"){
        cout<<"E "<<s<<endl;
    }
};

class F: virtual public B, virtual C, public D
{
    M m;
    public:
    F(const string& s): B("from F"), C("from F"), D("from F"), m("in F"){
        cout<<"F "<<s<<endl;
    }
};

class G: public E, public F
{
    M m;
    public:
    G(const string& s):B("from G"), C("from G"), E("from G"), F("from G"), m("in G")
    {
        cout<<"G "<<s<<endl;
    }
};

int main()
{
    G g("from main");
}

 

 
 
 
 
  • 名字查找问题
一般的作用域规则是:一个派生类被认为是嵌套在基类的作用域中,一般情况下,如果A直接或者间接的派生于B,或者换句话说,在继承层次中类A比类B处于更高的派生层次,那么名字A::f()就会比B::f()占优势,因此,在同名的两个函数之间进行选择时,编译器将选择占优势的那个函数,如果没有占优势的函数,就会产生二义性。
 
#include<iostream>
using namespace std;

class A
{
    public:
    virtual ~A(){}
    virtual void f(){
        cout<<"A::f()"<<endl;
    }
};

class B : virtual A
{
    public:
    void f(){
        cout<<"B::f()"<<endl;
    }
};

class C : public B{};
class D : public C, virtual public A{};

int main()
{
    B *p = new D;
    p->f();
    delete p;
}

 

posted @ 2012-09-13 16:20  w0w0  阅读(179)  评论(0编辑  收藏  举报