派生类与基类的转换关系

原创 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 #include using namespace std; class A { private: int val; public: A(int _val = 0):val(...

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

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

基类与派生类的关系

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

派生类和基类之间的关系

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

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

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

C++中基类和派生类之间的转换实例

 本文实例讲解了C++中基类和派生类之间的转换。对于深入理解C++面向对象程序设计有一定的帮助作用。此处需要注意:本文实例讲解内容的前提是派生类继承基类的方式是公有继承,关键字public。具体...

从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。 声明构造函数时,只需要对本类中新增成...

从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

一、不能自动继承的成员函数 构造函数 析构函数 =运算符 二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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