指向派生类的基指针

时间:2013-10-26 03:42:42

标签: c++ pointers inheritance dynamic

假设有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()中有新功能DerivedB->g()是否会正确调用此功能怎么办?

还有一个是,

int *a = new double;

double *a = new int;

合法?

2 个答案:

答案 0 :(得分:5)

第一个问题,因为继承意味着Derived“是”Base,那么DerivedBase的一种,所以它对{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;

由于intdouble都不是类,因此显然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();