C++子类和基类的相互转换

C++子类和基类的相互转换

1️⃣基类对象指针可以隐式转换为子类对象指针

2️⃣子类对象转换为基类对象,基类必须存在虚函数表,不然访问报错。

#include<iostream>
using namespace std;

//基类
class Base
{
public:
	Base() {}
	~Base() {}
	 virtual void fun() {
		cout << "base fun"<<endl;
	}
private:
	string str;
};

//子类
class Sub :public Base{
public:
	Sub() {}
	~Sub() {}
	virtual void fun()
	{
		cout << "sub fun" << endl;
	}
private:
	int age;
};

int main()
{
	//1.创建子类
	Sub* f = new Sub;
	f->fun();

	//2.创建指向子类的基类指针
	Base* ba = f;	//基类对象指针可以隐式转换为子类对象
	ba->fun();		//调用的也是子类fun

	//3.创建基类对象
	Base* base = new Base;
	base->fun();
	//4.创建指向基类的子类指针
	Sub* sub = (Sub*)base;	//必须是虚函数
	sub->fun();

	//Sub* pSub = dynamic_cast<Sub*>(base);	//动态类型转换 只能用于含有虚函数的类,用于类层次间的向上(向上造型不检查)和向下(向下造型借助RTTI检查)转化。
	//pSub->fun();
	return 0;
}
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++中,子类基类之间的转换可以通过类型转换实现。在进行子类基类之间的转换时,需要注意以下几点: 1. 子类对象可以直接转换基类对象,因为子类对象中包含了基类对象的所有成员。 2. 基类对象不能直接转换子类对象,因为基类对象中不包含子类对象的成员。如果需要将基类对象转换子类对象,则需要使用强制类型转换,但这种转换可能会导致编译错误或运行时错误。 3. 在进行子类基类之间的指针转换时,可以使用dynamic_cast操作符进行安全转换。dynamic_cast操作符可以检查转换是否合法,如果转换不合法,则会返回空指针。 示例代码如下: ```c++ class Base { public: virtual void foo() { cout << "Base::foo() called" << endl; } }; class Derived : public Base { public: void foo() override { cout << "Derived::foo() called" << endl; } }; int main() { // 子类对象可以直接转换基类对象 Derived d; Base &b = d; // 基类对象不能直接转换子类对象 Base b2; // 编译错误:invalid static_cast from type 'Base' to type 'Derived&' // Derived &d2 = static_cast<Derived &>(b2); // 使用dynamic_cast进行安全转换 Base *pb = new Derived(); Derived *pd = dynamic_cast<Derived *>(pb); if (pd) { pd->foo(); // Derived::foo() called } else { cout << "dynamic_cast failed" << endl; } delete pb; return 0; } ``` 在上面的示例代码中,定义了一个基类Base和一个子类Derived,其中子类继承了基类。在main函数中,首先将子类对象d转换基类对象b,然后尝试将基类对象b2转换子类对象d2,但这个转换是不合法的,会导致编译错误。接着定义了一个基类指针pb,将其指向子类对象,并使用dynamic_cast将其转换子类指针pd,如果转换成功,则调用子类的foo方法,否则输出转换失败的信息。最后记得释放动态分配的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeRoy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值