您的位置:首页 > 其它

派生类与基类的转换关系

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 如果添加了虚函数,上述转换关系依然存在,只不过访问的函数遵循多态性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: