Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Multiple Inheritance

8 views
Skip to first unread message

Alex Vinokur

unread,
Jul 28, 1999, 3:00:00 AM7/28/99
to tay
tay wrote:

> Can anyone give me a real world example of multiple inheritance where
> the heritance should be virtual . But how come non-virtual inheritance
> is inappropriate?

Hi,

Here is an example with virtual multi-inheritance.

Alex

//#########################################################
//------------------- C++ code : BEGIN -------------------

/*
Here is a classes hierarchy.

AAA
|
|
BBB
|
__________|__________
| |
| |
CCC1 CCC2
| |
|___________________|
|
|
DDD
|
|
EEE

Here is a C++ program which implements the above hierarchy.
*/

//##############################################
#include <iostream>

//================ AAA ==========================
class AAA
{
private:
int valueAAA_;

public:
AAA (int valueAAA_i)
{
cout << __PRETTY_FUNCTION__ << endl;
// __PRETTY_FUNCTION__ is predefined variable
// in GNU gcc/g++/egcs
valueAAA_ = valueAAA_i;
}
void show_valueAAA()
{
cout << __PRETTY_FUNCTION__
<< " \t: valueAAA = "
<< valueAAA_
<< endl;
}
};

//================ BBB ==========================
class BBB : public AAA
{
private:
int valueBBB_;

public:
BBB (int valueAAA_i,
int valueBBB_i)
: AAA (valueAAA_i)
{
cout << __PRETTY_FUNCTION__ << endl;
valueBBB_ = valueBBB_i;
}
void show_valueBBB()
{
cout << __PRETTY_FUNCTION__
<< " \t: valueBBB = "
<< valueBBB_
<< endl;
}
};

//================ CCC1 ==========================
class CCC1 : virtual public BBB
{
private:
int valueCCC1_;

public:
CCC1 (int valueAAA_i,
int valueBBB_i,
int valueCCC1_i
)
: BBB (valueAAA_i,
valueBBB_i
)
{
cout << __PRETTY_FUNCTION__ << endl;
valueCCC1_ = valueCCC1_i;
}

void show_valueCCC1()
{
cout << __PRETTY_FUNCTION__
<< " \t: valueCCC1 = "
<< valueCCC1_
<< endl;
}
};

//================ CCC2 ==========================
class CCC2 : virtual public BBB
{
private:
int valueCCC2_;

public:
CCC2 (int valueAAA_i,
int valueBBB_i,
int valueCCC2_i)
: BBB (valueAAA_i,
valueBBB_i
)
{
cout << __PRETTY_FUNCTION__ << endl;
valueCCC2_ = valueCCC2_i;
}

void show_valueCCC2()
{
cout << __PRETTY_FUNCTION__
<< " \t: valueCCC2 = "
<< valueCCC2_
<< endl;
}
};

//================ DDD ==========================
class DDD : public CCC1, public CCC2
{
private:
int valueDDD_;

public:
DDD (int valueAAA_i,
int valueBBB_i,
int valueCCC1_i,
int valueCCC2_i,
int valueDDD_i
)
//===========================================
// We must call BBB-constructor here
: BBB (valueAAA_i,
valueBBB_i
),

//---------------------------
CCC1 (valueAAA_i + 1, // It will be ignored
valueBBB_i + 1, // It will be ignored
valueCCC1_i
),
// So, it is worth using here
// the following CCC1-constructor :
// CCC1 (int valueCCC1_i).
// This constructor must be added in class CCC1

//---------------------------
CCC2 (valueAAA_i + 2, // It will be ignored
valueBBB_i + 2, // It will be ignored
valueCCC2_i
)
// So, it is worth using here
// the following CCC2-constructor :
// CCC2 (int valueCCC2_i).
// This constructor must be added in class CCC2
//===========================================
{
cout << __PRETTY_FUNCTION__ << endl;
valueDDD_ = valueDDD_i;
}
void show_valueDDD()
{
cout << __PRETTY_FUNCTION__
<< " \t: valueDDD = "
<< valueDDD_
<< endl;
}
};

//================ EEE ==========================
class EEE : public DDD
{
private:
int valueEEE_;

public:
EEE (int valueAAA_i,
int valueBBB_i,
int valueCCC1_i,
int valueCCC2_i,
int valueDDD_i,
int valueEEE_i
)
//===========================================
// We must call BBB-constructor here
: BBB (valueAAA_i,
valueBBB_i
),

//---------------------------
DDD (valueAAA_i + 1, // It will be ignored
valueBBB_i + 1, // It will be ignored
valueCCC1_i,
valueCCC2_i,
valueDDD_i
)
// So, it is worth using here
// the following DDD-constructor :
// DDD (int valueCCC1_i,
// int valueCCC2_i,
// int valueDDD_i
// )
// This constructor must be added in class DDD
//===========================================
{
cout << __PRETTY_FUNCTION__ << endl;
valueEEE_ = valueEEE_i;
}

void show_valueEEE()
{
cout << __PRETTY_FUNCTION__
<< " \t: valueEEE = "
<< valueEEE_
<< endl;
}
};

//########################################
int main()
{
//=========================
cout << endl << "\t=== AAA object ===" << endl;
AAA aaa (10);
aaa.show_valueAAA ();

//=========================
cout << endl << "\t=== BBB object ===" << endl;
BBB bbb (100, 200);
bbb.show_valueAAA ();
bbb.show_valueBBB ();

//=========================
cout << endl << "\t=== CCC1 object ===" << endl;
CCC1 ccc1 (1000, 2000, 3000);
ccc1.show_valueAAA ();
ccc1.show_valueBBB ();
ccc1.show_valueCCC1 ();

//=========================
cout << endl << "\t=== CCC2 object ===" << endl;
CCC2 ccc2 (10000, 20000, 30000);
ccc2.show_valueAAA ();
ccc2.show_valueBBB ();
ccc2.show_valueCCC2 ();

//=========================
cout << endl << "\t=== DDD object ===" << endl;
DDD ddd (100000, 200000, 300000, 400000, 500000);
ddd.show_valueAAA ();
ddd.show_valueBBB ();
ddd.show_valueCCC1 ();
ddd.show_valueCCC2 ();
ddd.show_valueDDD ();

//=========================
cout << endl << "\t=== EEE object ===" << endl;
EEE eee (1000000, 2000000, 3000000, 4000000, 5000000, 6000000);
eee.show_valueAAA ();
eee.show_valueBBB ();
eee.show_valueCCC1 ();
eee.show_valueCCC2 ();
eee.show_valueDDD ();
eee.show_valueEEE ();
return 0;
}
//------------------- C++ code : END ----------------------

//#########################################################
//------------------- Running Results : BEGIN -------------

=== AAA object ===
AAA::AAA(int)
void AAA::show_valueAAA() : valueAAA = 10

=== BBB object ===
AAA::AAA(int)
BBB::BBB(int, int)
void AAA::show_valueAAA() : valueAAA = 100
void BBB::show_valueBBB() : valueBBB = 200

=== CCC1 object ===
AAA::AAA(int)
BBB::BBB(int, int)
CCC1::CCC1(int, int, int)
void AAA::show_valueAAA() : valueAAA = 1000
void BBB::show_valueBBB() : valueBBB = 2000
void CCC1::show_valueCCC1() : valueCCC1 = 3000

=== CCC2 object ===
AAA::AAA(int)
BBB::BBB(int, int)
CCC2::CCC2(int, int, int)
void AAA::show_valueAAA() : valueAAA = 10000
void BBB::show_valueBBB() : valueBBB = 20000
void CCC2::show_valueCCC2() : valueCCC2 = 30000

=== DDD object ===
AAA::AAA(int)
BBB::BBB(int, int)
CCC1::CCC1(int, int, int)
CCC2::CCC2(int, int, int)
DDD::DDD(int, int, int, int, int)
void AAA::show_valueAAA() : valueAAA = 100000
void BBB::show_valueBBB() : valueBBB = 200000
void CCC1::show_valueCCC1() : valueCCC1 = 300000
void CCC2::show_valueCCC2() : valueCCC2 = 400000
void DDD::show_valueDDD() : valueDDD = 500000

=== EEE object ===
AAA::AAA(int)
BBB::BBB(int, int)
CCC1::CCC1(int, int, int)
CCC2::CCC2(int, int, int)
DDD::DDD(int, int, int, int, int)
EEE::EEE(int, int, int, int, int, int)
void AAA::show_valueAAA() : valueAAA = 1000000
void BBB::show_valueBBB() : valueBBB = 2000000
void CCC1::show_valueCCC1() : valueCCC1 = 3000000
void CCC2::show_valueCCC2() : valueCCC2 = 4000000
void DDD::show_valueDDD() : valueDDD = 5000000
void EEE::show_valueEEE() : valueEEE = 6000000

//------------------- Running Results : END ---------------

//#########################################################
//------------------- Compiler & System ------------------

g++ -v : gcc version egcs-2.91.57 19980901
(egcs-1.1 release)

uname -a : SunOS <nodename> 5.6 Generic_105181-09
sun4m sparc SUNW,SPARCstation-5

//---------------------------------------------------------

0 new messages