声明指向基类和派生类的指针

sky*_*oor 4 c++ polymorphism inheritance

我刚刚发现我对C++中的一个基本问题感到困惑

class Base {

};

class Derived : public Base {

}

Base *ptr = new Derived(); 
Run Code Online (Sandbox Code Playgroud)

这是什么意思?ptr指向Base类或Derived类?在这一行,为ptr分配了多少内存?根据Derived或Base的大小?

这和之间有什么区别:

Base *ptr = new Base();
Derived *ptr = new Derived();
Run Code Online (Sandbox Code Playgroud)

有这样的情况吗?

Derived *ptr = new Base();
Run Code Online (Sandbox Code Playgroud)

谢谢!

jld*_*ont 13

因为Base *ptr = new Derived();内存是根据Derived类分配的.ptr指向该对象但指示编译器仅对Base该类中声明的对象成员"授予访问权限"(可见性).

当然,与指针相关联的存储器ptr是相同的,即独立于指示它指向的对象.通常,"指针对象"的大小在CPU架构上是恒定的,例如32位/ 64位(例如,在嵌入式设备上更小).

对于Derived *ptr = new Base();:不,这是无效的.

Derived不仅仅是一个类,Base而是定义为派生Base:因此,Derived对象实例的指针实例不能仅仅分配给类的对象实例Base.


您可能会考虑仔细阅读维基百科对多态性继承的贡献.