为什么通过基类指针进行的派生类初始化与通过派生类指针进行的初始化不同?

法蒂玛·塔里克(Fatima Tariq)
#include <iostream>
using namespace std;

class Base {
public:
        void F(){cout << "Base::F" << endl;};
        virtual void G(){cout << "Base::G" << endl;};
};

class Derived : public Base {
public:
        void F(){cout << "Derived::F" << endl;};
        void G(){cout << "Derived::G" << endl;};
};

int main(){
        Derived *pDerived = new Derived;
        pDerived->F(); //F was redefined
        pDerived->G(); //G was overriden
        Base *pBase = new Derived;
        pBase->F();
        pBase->G();

}

此代码的输出是:

Derived::F
Derived::G
Base::F
Derived::G

为什么代码不产生以下输出?

Derived::F
Derived::G
Derived::F
Derived::G

即,当通过基类指针初始化派生类对象时,为什么非虚拟函数的函数定义与通过派生类指针初始化的派生类对象的函数定义不同?当我们调用“新派生”时,是否应该从基类指针还是派生类指针初始化同一类型的对象?

大卫·罗德里格斯(DavidRodríguez)-德里贝斯

该函数F()不是虚拟的,这意味着该函数调用将以指针/引用的静态类型静态分派到版本,而不是让它在运行时查找对象的真正动态类型。

您可以从一个指针访问相同的函数,以Derived确定您对哪个变体感兴趣:

pDerived->Base::F();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过基初始化派生类

来自分类Dev

通过基初始化派生类

来自分类Dev

为什么派生类成员的初始化值转换为基指针时没有丢失?

来自分类Dev

基类变量用派生类初始化

来自分类Dev

通过CRTP使用派生类变量初始化基类静态const变量

来自分类Dev

为什么抽象派生类需要初始化虚拟基类?

来自分类Dev

为什么在派生类数据之前初始化基类数据

来自分类Dev

为什么抽象派生类需要初始化虚拟基类?

来自分类Dev

c ++ 1y将允许派生类对基类变量进行类内初始化吗?

来自分类Dev

如何使用for循环从包含不同派生类的基类数组初始化对象?

来自分类Dev

有什么方法可以防止派生类初始化基类引用

来自分类Dev

用指向派生类的指针初始化auto_ptr是否安全?

来自分类Dev

使用派生类成员初始化父类

来自分类Dev

可以通过以下方法在派生类中初始化受保护的基类成员:

来自分类Dev

为什么派生类的构造函数在初始化列表中使用基类的默认构造函数?

来自分类Dev

派生类的C++初始化列表编译失败,为什么?

来自分类Dev

在C ++中初始化派生类参数

来自分类Dev

C ++模板和派生类成员初始化

来自分类Dev

从派生类初始化const融合增强列表

来自分类Dev

从派生类初始化const融合增强列表

来自分类Dev

在C ++中初始化派生类参数

来自分类Dev

如何在派生类中存储在基类初始化期间获得的信息?

来自分类Dev

如何从基类的实例初始化派生类的实例?

来自分类Dev

初始化之前,C ++派生类在基类上调用方法

来自分类Dev

如何在派生类中初始化基类staic内联数据成员?

来自分类Dev

C ++-在派生类中静态初始化基类保护的成员变量

来自分类Dev

如何在派生类中存储在基类初始化期间获得的信息?

来自分类Dev

派生类的静态字段在基类中需要之前未初始化

来自分类Dev

从基类通用初始化派生类的字段的可靠方法吗?

Related 相关文章

  1. 1

    通过基初始化派生类

  2. 2

    通过基初始化派生类

  3. 3

    为什么派生类成员的初始化值转换为基指针时没有丢失?

  4. 4

    基类变量用派生类初始化

  5. 5

    通过CRTP使用派生类变量初始化基类静态const变量

  6. 6

    为什么抽象派生类需要初始化虚拟基类?

  7. 7

    为什么在派生类数据之前初始化基类数据

  8. 8

    为什么抽象派生类需要初始化虚拟基类?

  9. 9

    c ++ 1y将允许派生类对基类变量进行类内初始化吗?

  10. 10

    如何使用for循环从包含不同派生类的基类数组初始化对象?

  11. 11

    有什么方法可以防止派生类初始化基类引用

  12. 12

    用指向派生类的指针初始化auto_ptr是否安全?

  13. 13

    使用派生类成员初始化父类

  14. 14

    可以通过以下方法在派生类中初始化受保护的基类成员:

  15. 15

    为什么派生类的构造函数在初始化列表中使用基类的默认构造函数?

  16. 16

    派生类的C++初始化列表编译失败,为什么?

  17. 17

    在C ++中初始化派生类参数

  18. 18

    C ++模板和派生类成员初始化

  19. 19

    从派生类初始化const融合增强列表

  20. 20

    从派生类初始化const融合增强列表

  21. 21

    在C ++中初始化派生类参数

  22. 22

    如何在派生类中存储在基类初始化期间获得的信息?

  23. 23

    如何从基类的实例初始化派生类的实例?

  24. 24

    初始化之前,C ++派生类在基类上调用方法

  25. 25

    如何在派生类中初始化基类staic内联数据成员?

  26. 26

    C ++-在派生类中静态初始化基类保护的成员变量

  27. 27

    如何在派生类中存储在基类初始化期间获得的信息?

  28. 28

    派生类的静态字段在基类中需要之前未初始化

  29. 29

    从基类通用初始化派生类的字段的可靠方法吗?

热门标签

归档