1

假设有Base类和Derived类。

Base *A = new Base;

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

我也看到了

Base *B = new Derived;

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

B->f()

将调用哪个版本的函数?类中的版本Base,或类中覆盖的版本Derived

如果有一个新函数void g()DerivedB->g()正确调用这个函数吗?

还有一个是

int *a = new double;

或者

double *a = new int;

合法的?

4

2 回答 2

8

第一个问题,由于继承意味着Derived"is a" Base,那么 aDerived是一种,所以 a能够指向Base它是有意义的。Base *

当您调用 时B->f(),您将获得由f()定义的版本Derived,而不是由定义的版本Base(除非Derived实际上没有重新定义它)。这(连同引用)是在 C++ 中获得这种多态行为的主要方法。

第二个问题,如果Derived定义了一个不是成员的函数g(),那么您将无法通过 a 调用它。通过a调用函数时,只能调用接口提供的函数。如果定义了一个not的函数,那么即使重新定义它,您也会得到该函数的版本,而不是版本。BaseBase *Base *BaseBaseg() virtualBaseDerivedDerived

第三个问题:

int *a = new int;

是合法的,但是:

int *a = new double;

由于既不是类int也不double是类,所以显然double不是从int.

于 2013-10-26T03:49:43.520 回答
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();
于 2013-10-26T06:28:07.100 回答