派生类与基类的转换关系

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 如果添加了虚函数,上述转换关系依然存在,只不过访问的函数遵循多态性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值