c++ - 无需强制转换即可分配具有不同数据类型地址的指针

标签 c++ pointers

我以前从未见过这种代码:

(B类是A类的子类)

ClassB objB;
ClassA *ptrA = &objB; // Question1
ClassA objA = *ptrA // Question2

问题1:

为什么这个赋值是有效的?

相比有什么区别
Class B objB;
Class A *ptrA;
ptrA = (ClassA*)&objB;

ClassB  *ptrA;
ptrA = new classB;

问题2:

这一行也是有效的。虽然这个概念看起来与之前的非常相似,但我不知道它是如何工作的。

谁能告诉我为什么这些分配有效?

最佳答案

在 C++ 中,基类指针可以指向派生类的对象。此语言规则使这些语句在 C++ 中有效。
首先,这是允许的,因为这不会产生任何问题,因为使用基类指针访问对象不会访问任何未定义的内存或函数。因为在基类中定义的任何东西也在子类/派生类中定义。
此功能允许动态多态。其中派生类可以实现不同的功能,单个基类指针将调用派生类对象的函数,并且将根据基类指针指向的对象的类型调用函数。如果不允许基指针指向派生类对象和调用函数,则无法实现此功能。

关于c++ - 无需强制转换即可分配具有不同数据类型地址的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22683134/

相关文章:

提取字符串崩溃的代码

c++ - 是否可以创建一个链表来保存指针而不是整数或字符串?

c++ - 为什么在GCC上调用std::package_task失败

C++ IP 地址人类可读形式

c++ - CNG:何时使用 BCrypt* 与 NCrypt* 系列函数

C++ 引用变量的初始化

c++ - 指向连续内存的指针

c++ - 为什么静态全局变量初始化为零,但类中的静态成员变量没有初始化?

c++ - 对象的变量在 vector 中重置(从 void* 转换)

c++ - 在堆栈与堆上对派生类对象使用基类指针