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)
法律?
第一个问题,因为继承意味着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.