C++将一个指针分配给另一个指针时执行的类型检查
C++ typechecks performed when assigning one pointer to another
我想知道编译器在下面所做的类型检查的扩展
class Parent{
};
class Child : public Parent{
};
class Unrelated{
};
main(){
Parent* p = new Child() // OK. But type of p is still Parent* and not Child*
Unrelatead* u = new Child() // Not OK. Child* is not Unrelated*.
}
因此,在第一个赋值中,p 现在指向 Child 中的"Parent"对象,而第二个赋值根本不允许,尽管最终 p 和 you 都将保留内存地址。
编译器在这些赋值期间执行的确切检查是什么,编译器在编译的哪个部分强制执行这些检查?
第一个赋值是可以的,因为编译器会将基类的所有内存排列在派生类的内存前面。 因此,您可以向上转换指针,因为基类的所有字段仍将指向。
第二个分配是不行的,因为Child
不会从Unrelated
继承,因此它们的内存布局可能不同。 编译器跟踪这些类层次结构。 这些检查仅在编译时进行。
请注意,向上投射指针可能很危险。 如果类不是虚拟的,则delete p
不会调用派生类的析构函数,从而导致潜在的内存泄漏。 如果您决定向上广播并delete
指针,请确保您正在为虚拟课程执行此操作。
编译器允许分配数据指针:
- 当两者都是指向同一类型的指针,或者目标指针是指向更严格的
const
/volatile
限定类型的指针时,例如T*
T const volatile*
.
指向派生类的指针 - 可以分配给指向具有类似或更严格的
const
/volatile
限定的可访问基类的指针,例如Derived*
到Base const*
. - 任何指向具有类似或更严格的
const
/volatile
资格void*
的数据指针,例如T const*
void const*
.
Parent* p = new Child();
编译,因为它是案例 2。
Unrelatead* u = new Child();
无法编译,因为它不是上述情况。要使不相关的数据指针之间的分配正常工作,需要reinterpret_cast<>
。
相关文章:
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将指针从一个void函数传递到另一个C++
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 将指针分配给另一个指针时会发生什么情况?
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++将一个指针分配给另一个指针时执行的类型检查
- 将一个类的方法指针存储到另一个类中
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 初始化类中的指针数组,并在另一个类中检索它
- 从另一个指针指向函数的指针
- 使用指向成员函数的指针在另一个类中调用类构造函数
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- 如果类"A"具有指向另一个类的指针,则"B" A 可以访问 B 类公共方法
- 如何使用指针从另一个类访问属性
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- C++ 无效双指针干扰另一个
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针