派生类与基类的转换关系

原创 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++一个主要目标是提供代码重用,类继承是实现该目标的重要途径之一。从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。 派生类和基类的关系: 1. 派生类对象存储了基类...
  • white__bear
  • white__bear
  • 2015年12月03日 22:30
  • 3419

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

区分“派生类对象”和“派生类”对基类成员的访问权限。 l “派生类对象”对基类成员的访问权限:    (1)对于公有继承,只有基类的公有成员可以被“派生类对象”访问,其他(保护和私有)成员不能被访问。...
  • KingCat666
  • KingCat666
  • 2015年04月06日 21:58
  • 1167

派生类,基类类型转换

派生类,基类类型转换
  • kturing
  • kturing
  • 2015年06月19日 10:26
  • 1254

派生类向基类转换的可访问性

感觉基类、派生类的关系是很微妙的,派生类向基类转换的可访问性,C++ Primer(中文5版,Ch15.5)给出了三句解释说明: 只有当Derived公有继承Base时,用户代码才能使用派生类向基类的...
  • kturing
  • kturing
  • 2015年06月23日 14:15
  • 682

C++-继承:基类与派生类的关系

成员函数的重定义和名字隐藏基类的数据成员和成员函数在派生类中都有一份拷贝,派生类能够直接访问从基类继承而来的public和protected成员,且只能够通过这两类成员访问从基类继承而来的privat...
  • ko_tin
  • ko_tin
  • 2017年02月23日 18:29
  • 331

c#派生类转换为基类的意义

由于这段时间一直纠结于c#继承的一些小问题,所以把这段时间的收获写下。 代码如下: using System; using System.Collections.Generic; namesp...
  • shiluo_wujin
  • shiluo_wujin
  • 2017年11月11日 18:43
  • 168

C++笔记:派生类到基类转换到可访问性

要确定到基类的转换是否可访问,可以考虑基类的public成员是否可访问,如果可以,转换是可以访问的,否则,转换是不可访问的。...
  • liufei_learning
  • liufei_learning
  • 2014年03月20日 06:43
  • 4565

C++ - 派生类强制转换为基类

派生类强制转换为基类 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24268821 在多态的使用时, 派生类的指针或引用...
  • u012515223
  • u012515223
  • 2014年04月21日 19:37
  • 3035

C++ Primer 学习笔记(9): 基类和派生类的转换

1、派生类到基类的转换      如果有一个派生类型的对象,则可以使用它的地址对基类类型的指针进行赋值或初始化。同样,可以使用派生类型的引用或对象初始化积累类型的引用。严格说来,对对象没有类似转换。编...
  • roden
  • roden
  • 2010年03月24日 20:14
  • 3425

C# 基类和派生类

1. 基类和派生类的一些基本概念     class B : A{}   A 是基类 ,B 是派生类 .   一个类最多只允许从一个类中派生 .   class C : B{}   B 还可以...
  • chenjinglong
  • chenjinglong
  • 2013年10月04日 14:51
  • 4006
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:派生类与基类的转换关系
举报原因:
原因补充:

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