不能用类型不匹配的指针来完成赋值,如下代码是错的:
int i = 0;
double *dp = &i; // 非法,类型不匹配
但是 void* 可用于存放任意对象的地址:
int i = 42;
void *p = &i; // 合法
还有特殊字面值 nullptr,可以转换成任意其它的指针类型,用来判断指针是否指向了一个合法的对象。
如果一定要完成指针的类型转换,可以使用 C++11 的几种强制类型转换:
- 指针类型转换 (reinterpret_cast)
int *pint = 1;
char *pch = reinterpret_cast<char *>(pint);
- 涉及到 const 的指针类型转换 (const_cast)
const int num[5] = { 1,2,3,4,5 };
const int *p = num;
int *pint = const_cast<int *>(p);
- 子类指针转化为父类指针 (dynamic_cast)
class man {
public:
int name;
// 加上 virtual 关键字, 可以使得父类用子类初始化后可以调用子类的函数
virtual void run() {
cout << "man is running" << endl;
}
};
class son : public man {
public:
void run() {
cout << "son is running" << endl;
}
};
void main()
{
man *pman = new man;
son *pson = new son;
//子类指针转换为父类指针, 但是还是调用子类的函数
man *pfu = dynamic_cast<man *>(pson);
pfu->run();
}
网友评论