高级强制类型转换——C++(38)

高级强制类型转换

静态对象强制类型转换
例如

 Company *company = new TechCompany("APPLE","Iphone");
 右边返回了一个TechCompany类型的指针,左边定义了一个Company类型的指针,叫做company;
 
 TechCompany *techCompany = company;
 这里定义了一个Techcompany类型的指针,想把指针company指向的"APPLE"公司的内容赋值传给新定义的Techcompany

这两句话的意思是: 两个相同类型的变量通过指针赋值,但是中间经过了一个不同类型的指针,理论上是可行的,因为中间经过的和它们是继承关系,但是编译器不认,所以需要进行强制类型转换。
解决方法

Company *company = new TechCompany("APPLE","Iphone");
TechCompany *techCompany = (TechCompany*)company;
  • 中间经过的指针加上 (TechCompany * ) 强制转化为相同的类型

注意

  • 不能既删除company, 又删除techCompany, 因为强制类型转换不会创建一个副本拷贝,他只是告诉编译器把有关变量解释为另一种组合形式,所以他们指向的还是同一个地址。

动态对象强制类型转换

  • 更像是函数调用
dynamic_cast<MyClass*>(value);
  • 用来把一种类型的对象指针安全地强制转换为另一种类型的对象指针。
  • 注:如果value的类型不是一个MyClass类(或MyClass的子类)的指针,这个操作符将返回NULL

代码实现

1/2 静态对象强制类型转换

#include <iostream>
#include <string>

using namespace std;
class Company
{
public:
    Company(string theName,string product);
    virtual void printInfo();
    
protected:
    string name;
    string product;
};
Company::Company(string theName,string product)
{
    name = theName;
    this->product = product; 
} 
void Company::printInfo()
{
    cout << "这个公司的名字叫:" << name << "正在生产" << product << "\n";
}

class TechCompany:public Company
{
public:
    TechCompany(string theName,string product);
    virtual void printInfo();
};
TechCompany::TechCompany(string theName,string product):Company(theName,product)
{
}
void TechCompany::printInfo()
{
    cout << name << "公司大量生产了 " << product << "这款产品!\n";
}
 
int main()
{
    Company *company = new TechCompany("APPLE","Iphone");//定义TechCompany对象,Company类型 
                                                        //指针company指向其地址
    TechCompany *techCompany = (TechCompany*)company; //将Company类型强制转换为TechCompany类型    
    
    techCompany->printInfo();
    
    delete company;//释放内存(此处company与techCompany两个指针都指向TechCompany定义的对象) 
                   //所以释放内存只需要释放一次即可 
    company = NULL;
    techCompany = NULL;
    
    return 0;
}

2/2 动态对象强制类型转换

#include <iostream>
#include <string>

using namespace std;
class Company
{
public:
    Company(string theName,string product);
    virtual void printInfo();
    
protected:
    string name;
    string product;
};
Company::Company(string theName,string product)
{
    name = theName;
    this->product = product; 
} 
void Company::printInfo()
{
    cout << "这个公司的名字叫:" << name << "正在生产" << product << "\n";
}

class TechCompany:public Company
{
public:
    TechCompany(string theName,string product);
    virtual void printInfo();
};
TechCompany::TechCompany(string theName,string product):Company(theName,product)
{
}
void TechCompany::printInfo()
{
    cout << name << "公司大量生产了 " << product << "这款产品!\n";
}
 
int main()
{
    Company *company = new Company("APPLE","Iphone");//定义Company对象, 
                                                        //指针company类型为Company,指向其地址
    TechCompany *techCompany = dynamic_cast<TechCompany*>(company); //将Company类型强制转换为TechCompany类型    
    
    if(techCompany != NULL)
    {
        cout << "成功!\n"; 
    }
    else
    {
        cout << "悲催!\n";
    }
    delete company;//释放内存(此处company与techCompany两个指针都指向TechCompany定义的对象) 
                   //所以释放内存只需要释放一次即可 
    company = NULL;
    techCompany = NULL;
    
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

la via

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

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

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

打赏作者

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

抵扣说明:

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

余额充值