zoukankan      html  css  js  c++  java
  • C++ 虚继承

      多重继承中,一个基类可以在派生层次中出现多次,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多分同名成员。C++提供虚基类的方法使得在继承间接共同基类时只保留一份成员。

      1.通常,每个类至初始化自己的直接基类,在应用于虚基类的时候,这个初始化策略会失败。如果使用这个规则,则可能多次初始化虚基类。为了解决这个问题,从具有虚基类的类继承的类初始化进行特殊处理。在虚派生中,由最底层的派生类构造函数初始化虚基类。即使是最底层派生类的非直接虚基类,也在最底层的虚派生类中调用其构造函数。

      2.无论虚基类出现在继承层次中的任何地方,总是在构造非虚基类之前构造虚基类。代码如下:

    class A
    {
    public:
    A()
    {
    cout<<"A constructor!"<<endl;
    }
    };

    class B
    {
    public:
    B()
    {
    cout<<"B constructor!"<<endl;
    }
    };

    class C
    {
    public:
    C()
    {
    cout<<"C constructor!"<<endl;
    }
    };

    class D : public A, public B, virtual public C
    {
    public:
    D()
    {
    cout<<"D constructor!"<<endl;
    }
    };


    int _tmain(int argc, _TCHAR* argv[])
    {
    D d;
    return 0;
    }

    运行结果:

    可以看出,即使是C类在派生列表的最后,类C也是首先构造,因为C为虚基类。但是如果虚基类还有一个基类而且该基类不是虚基类,则必须先构造基类,代码如下:

    class A
    {
    public:
      A()
      {
        cout<<"A constructor!"<<endl;
      }
    };

    class B
    {
    public:
      B()
      {
        cout<<"B constructor!"<<endl;
      }
    };

    class C
    {
    public:
      C()
      {
        cout<<"C constructor!"<<endl;
      }
    };

    class E : public C
    {
    public:
      E()
      {
        cout<<"E constructor!"<<endl;
      }
    };

    class D : public A, public B, virtual public E
    {
    public:
      D()
      {
        cout<<"D constructor!"<<endl;
      }
    };


    int _tmain(int argc, _TCHAR* argv[])
    {
      D d;
      return 0;
    }

    运行结果:

    虽然E是虚基类而C不是,但是还是先构造了C,因为C是E的基类,在构造一个类之前,必须先构造基类,即使是虚继承也不例外。

  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/lzmfywz/p/2991922.html
Copyright © 2011-2022 走看看