gpt4 book ai didi

c++ - 指向派生类的基指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:26:45 25 4
gpt4 key购买 nike

假设有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 类中覆盖的版本。

如果Derived中有一个新函数void g()B->g()会调用这个函数吗合适吗?

还有一个是,是

int *a = new double;

double *a = new int;

合法吗?

最佳答案

第一个问题,因为继承意味着 Derived "is"Base , 然后是 Derived是一种 Base , 所以对于 Base * 是有意义的能够指向它。

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

第二个问题,如果Derived定义一个函数 g()也是Base的成员, 那么你将无法通过 Base * 调用它.通过 Base * 调用函数时, 只能调用接口(interface)提供给Base的那些函数.如果Base定义了一个函数 g()这是不是 virtual , 然后你会得到 Base该函数的版本,而不是 Derived版本,即使 Derived重新定义它。

第三个问题:

int *a = new int;

是合法的,但是:

int *a = new double;

因为int也不double是类,所以很明显double不是来自 int .

关于c++ - 指向派生类的基指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19602548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com