天天看點

虛基類 java,虛方法、虛基類、基類指針

//虛方法、虛基類、基類指針,指向派生類的指針隻能指向所指派生類重寫的方法,以及指針所屬類的

//所有公有方法

#include

using std::cout;

using std::endl;

class Base

{

public:

virtual void fun()

{

cout << "come from Base fun()" << endl;

}

};

class C_A0: virtual public Base

{

public:

virtual void fun()

{

cout << "come from C_A0 fun()" << endl;

}

void funCA00()

{

cout << "come from class C_A0 " << endl;

}

};

class C_A1: virtual public Base

{

public:

virtual void fun()

{

cout << "come from C_A1 fun()" << endl;

}

void funCA10()

{

cout << "come from class C_A1 " << endl;

}

};

class C_B0 : virtual public C_A0, virtual public C_A1

{

public:

virtual void fun()

{

cout << "come from C_B0 fun()" << endl;

}

void funCB00()

{

cout << "come from class C_B0" << endl;

}

C_A0 ca0Var0;

};

int main()

{

Base co_Base_Var0;

C_A0 co_CA0_Var0;

C_A1 co_CA1_Var0;

C_B0 co_CB0_Var0;

cout<< "|-----------------------------------------|" << endl;

cout<< "            Base* p_Base_0;" << endl;

Base* p_Base_0;

cout<< "|-----------------------------------------|" << endl;

p_Base_0 = &co_Base_Var0;

p_Base_0->Base::fun();

p_Base_0->fun();

co_Base_Var0.fun();

cout<< "|-----------------------------------------|" << endl;

p_Base_0 = &co_CA0_Var0;

p_Base_0->C_A0::Base::fun();

p_Base_0->Base::fun();

//p_Base_0->C_A0::fun(); //error: 'C_A0' is not a base of 'Base'    p_Base_0->fun();

co_CA0_Var0.fun();

cout<< "|-----------------------------------------|" << endl;

p_Base_0 = &co_CA1_Var0;

p_Base_0->C_A1::Base::fun();

p_Base_0->Base::fun();

//p_Base_0->C_A1::fun(); //error: 'C_A1' is not a base of 'Base',基類指針指向第一層派生類,是以解析的順序為“派生類::派生:: … 基類::方法“,C_A1不是Base的基類,故出錯    p_Base_0->fun();

co_CA1_Var0.fun();

cout<< "|-----------------------------------------|" << endl;

p_Base_0 = &co_CB0_Var0;

p_Base_0->C_B0::C_A0::Base::fun();

p_Base_0->C_B0::C_A1::Base::fun();

p_Base_0->C_A0::Base::fun();

p_Base_0->C_A1::Base::fun();

p_Base_0->Base::fun();

p_Base_0->Base::fun();

p_Base_0->fun();

//p_Base_0->funCB00();    co_CB0_Var0.fun();

cout<< "|-----------------------------------------|" << endl;

cout<< "            C_A0* p_CA0_0;" << endl;

C_A0* p_CA0_0;

cout<< "|-----------------------------------------|" << endl;

p_CA0_0 = &co_CB0_Var0;

p_CA0_0->C_A0::Base::fun();

p_CA0_0->C_A0::fun();

p_CA0_0->fun();

co_CB0_Var0.fun();

p_CA0_0->funCA00(); // 指針所屬類的所有公有方法都可以通路

return 0;

}

虛基類 java,虛方法、虛基類、基類指針