派生类与基类的转换关系

原创 2015年11月19日 23:43:08
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 如果添加了虚函数,上述转换关系依然存在,只不过访问的函数遵循多态性。


版权声明:本文为博主原创文章,未经博主允许不得转载。

c++派生类转换为基类与public、protected、private继承的关系

在《c++primer第四版中文》中p579,对“派生类到基类转换的可访问性”讲的比较模糊,于是用visual studio 2008花了四个小时把大部分能想到的情况都试验了一下,得出如下结果。 这...

派生类和基类的关系

派生类和基类的关系C++一个主要目标是提供代码重用,类继承是实现该目标的重要途径之一。从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。 派生类和基类的关系: 1. 派生类对象存储了基类...

关于基类与派生类之间对象、指针等转化关系的小结

先上一段代码: #include using namespace std; //没有使用虚函数的继承派生关系 class Base { public: Base(int i = 0):ival...

关于基类与派生类之间对象、指针等转化关系的小结

先上一段代码: #include using namespace std; //没有使用虚函数的继承派生关系 class Base { public: Base(int i = 0):iv...

【c++】深入剖析虚拟继承与各种继承关系中派生类内成员内存分布情况及虚基类表的内容

单继承 多继承 多重继承 菱形继承 单继承与虚继承 多继承与虚继承 多重继承与虚继承 菱形继承与虚继承 虚基类表指针 虚基类表 不同继承方式成员对面模型 内存分布情况 赋值顺序...

C++语言笔记系列之十五——派生类、基类、子对象的构造和析构函数调用关系

例子 example 1 注:若一个基类同时派生出两个派生类,即两个派生类从同一个基类继承,那么系统将为每一个简历副本,每个派生类独立地使用自己的基类副本(比如基类中有属于自己类的静态变量等)。 #i...

基类与派生类的关系

成员函数的重定义和名字隐藏派生类可以对基类的成员函数进行重定义或重载: 重定义是指派生类可以定义与基类具有相同函数原型(即具有相同的返回类型、函数名及参数列表)。 基类的public成员在派生类中...
  • jxnu_xx
  • jxnu_xx
  • 2015年07月25日 09:22
  • 196

派生类和基类之间的关系

1、派生类对象可以使用基类的方法,条件是方法不是私有的RatedPlayer rplayer(1140,"Mallory","Duck",true); rplayer.Name();2、基类指针可以在...

关于基类与派生类之间指针转化关系小结

#include #include using namespace std; class A { private: int val; public: A(int _val = 0):val(...

C++中派生类和基类的转换和访问控制

区分“派生类对象”和“派生类”对基类成员的访问权限。 l “派生类对象”对基类成员的访问权限:    (1)对于公有继承,只有基类的公有成员可以被“派生类对象”访问,其他(保护和私有)成员不能被访问。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:派生类与基类的转换关系
举报原因:
原因补充:

(最多只允许输入30个字)