//虚方法、虚基类、基类指针,指向派生类的指针只能指向所指派生类重写的方法,以及指针所属类的
//所有公有方法
#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;
}