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

372

被折叠的 条评论
为什么被折叠?



