高级强制类型转换
静态对象强制类型转换
例如
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;
}