派生类与基类的转换关系
2015-11-19 23:43
176 查看
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 如果添加了虚函数,上述转换关系依然存在,只不过访问的函数遵循多态性。
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 如果添加了虚函数,上述转换关系依然存在,只不过访问的函数遵循多态性。
相关文章推荐
- 修复Xcode更新之后的插件失效问题
- JAVA调用支付宝直充接口
- AFNetworking 2.x 设置header
- 自定义Toast的显示效果
- 【C语言】【面试题】【笔试题】写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
- hibernate3.jar has no source attachment
- 南昌大学软院大神养成计划----网页标签的使用
- 轻轻松松带你了解线程与进程
- 南大软院大神养成计划--第四天单/复选框与文字对齐问题
- OC的内存管理机制以及野指针问题
- C# out ref 重载
- Android照片墙应用实现,再多的图片也不怕崩溃
- HDU 5564:Clarke and digits 收获颇多的矩阵快速幂 + 前缀和
- Python导出Excel为Lua/Json/Xml实例教程(三):终极需求
- HDU 5564:Clarke and digits 收获颇多的矩阵快速幂 + 前缀和
- html5中datalist简单用法
- strstr查找子字符串函数
- 【C语言】【面试题】【笔试题】编写一个函数实现n^k,使用递归实现
- UINavigationController
- ios之performSelector 那点事