假设有Base
类和Derived
类。
Base *A = new Base;
这里A是指向Base类的指针,new
构造A指向的一个。
我也看到了
Base *B = new Derived;
如何解释这个?
B是指向Base
类的指针,以及由B构造和指向的Derived
类?
如果某个函数派生自Base
类,例如Virtual void f()
,并且它已在Derived
类中被覆盖,那么
B->f()
会调用哪个版本的函数? Base
类中的版本,或在Derived
类中重写的版本。
如果void g()
中有新功能Derived
,B->g()
是否会正确调用此功能怎么办?
还有一个是,
int *a = new double;
或
double *a = new int;
合法?
答案 0 :(得分:5)
第一个问题,因为继承意味着Derived
“是”Base
,那么Derived
是Base
的一种,所以它对{Base *
有意义1}}能够指向它。
当您致电B->f()
时,您将获得f()
定义的Derived
版本,而不是Base
定义的版本(除非Derived
没有实际上并没有重新定义它。这(以及引用)是在C ++中获取此多态行为的主要方法。
第二个问题,如果Derived
定义的函数g()
不是也是Base
的成员,那么您将无法调用通过Base *
。通过Base *
调用函数时,只能将接口提供的函数调用Base
。如果Base
定义了不 g()
的函数virtual
,那么您将获得该函数的Base
版本,而不是Derived
版本1}}版本,即使Derived
重新定义了它。
第三个问题:
int *a = new int;
是合法的,但是:
int *a = new double;
由于int
和double
都不是类,因此显然double
不是来自int
。
答案 1 :(得分:3)
What if there is a new function void g()in Derived, is B->g() going to invoke this function properly?
你可以这样调用它:
//! cast to derived if b really is base of derived
derived* d= dynamic_cast<derived*>(b);
//! d is 0 if b is not a base of derived
if(d)
d-> g();