【第22期】观点:IT 行业加班,到底有没有价值?

派生类与基类的转换关系

原创 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++中派生类和基类的转换和访问控制

区分“派生类对象”和“派生类”对基类成员的访问权限。 l “派生类对象”对基类成员的访问权限:    (1)对于公有继承,只有基类的公有成员可以被“派生类对象”访问,其他(保护和私有)成员不能被访问。...

C++中派生类之间的赋值对基类的影响

环境:VS2010 代码: #include &lt;iostream&gt; using namespace std; class A { public: A() { a = 0; cout&lt;&lt;&qu...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

派生类和基类的关系

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

JAVA基类和派生类

JAVA基类和派生类 从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 。但继承并不仅仅是类的复用。当创建了一个派生类的对象时,该类包含了一个基类的子对象。这个子对象和你用基类直接创建的对象没有什么两样。二者的区别在于,后者来自于外部,而基类的子对象来自...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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