1 派生类与基类能否转换与基类是否有虚函数无关,与继承方式有关
2 当以public方式继承时:
派生类对象可以转换为基类对象(static_cast),访问的是基类成员函数;同时派生类指针可以转换为基类指针(reinterpret_cast),访问的是基类成员函数
基类对象无法转换为派生类对象;但是基类指针可以转换为派生类指针(reinterpret_cast),访问的是派生类成员函数;
3 当以private方式继承时:
派生类对象无法转换为基类对象;但是派生类指针可以转换为基类指针(reinterpret_cast),访问的是基类成员函数;
基类对象无法转换为派生类对象;但是基类指针可以转换为派生类指针(reinterpret_cast),访问的是派生类成员函数;
4 验证1和2的代码
class Base{
public:
void Show(void)
{
cout << "Base::Show()"<<endl;
}
};
class Derived : private Base{
public:
void Show(void)
{
cout << "Derived::Show()"<<endl;
}
};
class Base2{
public:
void Show(void)
{
cout << "Base2::Show()"<<endl;
}
};
class Derived2 : public Base2{
public:
void Show(void)
{
cout << "Derived2::Show()"<<endl;
}
};
int main(void)
{
/*以public 方式继承*/
Base2 public_b;
Derived2 public_d;
Base2* public_pb;
Derived2* public_pd;
public_b = static_cast<Base2>(public_d); //允许
public_b.Show(); //访问的是Base2类
//public_d = static_cast<Derived2>(public_b); //Error
public_pb = reinterpret_cast<Base2*>(&public_d);
public_pb->Show(); //访问的是基类
public_pd = reinterpret_cast<Derived2*>(&public_b);
public_pd->Show(); //访问的是派生类
/*以private 方式继承*/
Base b;
Derived d;
Base* pb;
Derived* pd;
//d = static_cast<Derived2>(b); //Error
//b = static_cast<Base>(d); //Error
pd = reinterpret_cast<Derived*>(&b);
pb = reinterpret_cast<Base*>(&d);
pd->Show();//访问的是派生类
pb->Show();//访问的是基类
//如果Show定义成虚函数,那么上面访问的集资是基类和派生类
return 0;
}
5 如果添加了虚函数,上述转换关系依然存在,只不过访问的函数遵循多态性。