multiple inheritance 的问题 diamond inheritance,及解决办法 virtual inherit

diamond inheritance是多重继承中的一个问题,即两个父类就继承于同一个类。

 

这个问题其实挺诡异的,来看一下这个例子。

如果把for循环打开,那么这是一个错误的例子。解释是,因为Multiple继承了两个Base的基类,Base的指针不知道到底要指到哪个。

但是可以看到,如果把for循环注释了,仍然可以编译并运行。 好神奇啊。

/*
 * =====================================================================================
 *
 *       Filename:  multi_inherit2.cpp
 *
 *    Description: 
 *
 *        Version:  1.0
 *        Created:  09/17/2010 04:24:06 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (),
 *        Company: 
 *
 * =====================================================================================
 */
// Attempting to polymorphically call a function that is
// multiply inherited from two base classes.
#include <iostream>
using std::cout;
using std::endl;

// class Base definition
class Base
{
public:
   virtual void print() const = 0; // pure virtual
}; // end class Base

// class DerivedOne definition
class DerivedOne : public Base
{
public:
   // override print function
   void print() const
   {
      cout << "DerivedOne/n";
   } // end function print
}; // end class DerivedOne

// class DerivedTwo definition
class DerivedTwo : public Base
{
public:
   // override print function
   void print() const
   {
      cout << "DerivedTwo/n";
   } // end function print
}; // end class DerivedTwo

// class Multiple definition
class Multiple : public DerivedOne, public DerivedTwo
{
public:
   // qualify which version of function print
   void print() const
   {
      DerivedTwo::print();
   } // end function print
}; // end class Multiple

int main()
{
   Multiple both; // instantiate Multiple object
   DerivedOne one; // instantiate DerivedOne object
   DerivedTwo two; // instantiate DerivedTwo object
   Base *array[ 3 ]; // create array of base-class pointers

   cout << "sizeof(Base): " << sizeof(Base) << endl;
   cout << "sizeof(DerivedOne): " << sizeof(DerivedOne) << endl;
   cout << "sizeof(DerivedTwo): " << sizeof(DerivedTwo) << endl;
   cout << "sizeof(Multiple): " << sizeof(Multiple) << endl;
   both.print();
//   array[ 0 ] = &both; // ERROR--ambiguous
//   array[ 1 ] = &one;
//   array[ 2 ] = &two;
//
//   // polymorphically invoke print
//   for ( int i = 0; i < 3; i++ )
//      array[ i ] -> print();

   return 0;
} // end main

 

然后来看一个正确的例子,使用了虚继承。这样就可以使Multiple只有一个Base的subobject。

/*
 * =====================================================================================
 *
 *       Filename:  multi_inherit3.cpp
 *
 *    Description: 
 *
 *        Version:  1.0
 *        Created:  09/17/2010 04:37:49 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (),
 *        Company: 
 *
 * =====================================================================================
 */
// Fig. 24.14: fig24_14.cpp
// Using virtual base classes.
#include <iostream>
using std::cout;
using std::endl;

// class Base definition
class Base
{
public:
   virtual void print() const = 0; // pure virtual
}; // end class Base

// class DerivedOne definition
class DerivedOne : virtual public Base
{
public:
   // override print function
   void print() const
   {
      cout << "DerivedOne/n";
   } // end function print
}; // end DerivedOne class

// class DerivedTwo definition
class DerivedTwo : virtual public Base
{
public:
   // override print function
   void print() const
   {
      cout << "DerivedTwo/n";
   } // end function print
}; // end DerivedTwo class

// class Multiple definition
class Multiple : public DerivedOne, public DerivedTwo
{
public:
   // qualify which version of function print
   void print() const
   {
      DerivedTwo::print();
   } // end function print
}; // end Multiple class

int main()
{
   Multiple both; // instantiate Multiple object
   DerivedOne one; // instantiate DerivedOne object
   DerivedTwo two; // instantiate DerivedTwo object

   cout << "sizeof(Base): " << sizeof(Base) << endl;
   cout << "sizeof(DerivedOne): " << sizeof(DerivedOne) << endl;
   cout << "sizeof(DerivedTwo): " << sizeof(DerivedTwo) << endl;
   cout << "sizeof(Multiple): " << sizeof(Multiple) << endl;
   // declare array of base-class pointers and initialize
   // each element to a derived-class type
   Base *array[ 3 ];
   array[ 0 ] = &both;
   array[ 1 ] = &one;
   array[ 2 ] = &two;

   // polymorphically invoke function print
   for ( int i = 0; i < 3; i++ )
      array[ i ]->print();

   return 0;
} // end main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值