指向派生类的基指针

Jay*_*Jay 1 c++ inheritance pointers dynamic

假设有Base班级和Derived班级.

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

这里A是指向Base类的指针,并new构造A指向的一个.

我也看到了

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

怎么解释这个?B是指向BaseClass 的指针,是Derived由B构造和指向的类?如果有一个派生自Base类的函数,比如说Virtual void f(),并且它已在Derived类中被覆盖,那么

B->f()
Run Code Online (Sandbox Code Playgroud)

会调用哪个版本的函数?Base类中的版本,或在类中重写的版本Derived.

如果有什么新的功能void g()Derived,是B->g()要正确调用此函数?

还有一个是,是

int *a = new double;
Run Code Online (Sandbox Code Playgroud)

要么

double *a = new int;
Run Code Online (Sandbox Code Playgroud)

法律?

Cro*_*man 7

第一个问题,因为继承意味着Derived"是一个" Base,所以a Derived是一种Base,所以Base *能够指出它是有意义的.

当你打电话时B->f(),你将得到f()定义的版本Derived,而不是定义的版本Base(除非Derived实际上没有重新定义它).这(以及引用)是在C++中获取此多态行为的主要方法.

第二个问题,如果Derived定义一个也不g()是其成员的函数,那么你就无法通过一个函数来调用它.通过a调用函数时,只能调用接口提供的函数.如果定义的函数这是没有,那么你会得到的是功能,而不是版本版本,即使重新定义它.BaseBase *Base *BaseBaseg() virtualBaseDerivedDerived

第三个问题:

int *a = new int;
Run Code Online (Sandbox Code Playgroud)

是合法的,但是:

int *a = new double;
Run Code Online (Sandbox Code Playgroud)

因为既不是类int也不double是类,所以显然double不是源于int.