c++ - 为什么通过基类指针初始化派生类与通过派生类指针初始化不同?

标签 c++ inheritance polymorphism virtual-functions

#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

即为什么通过基类指针初始化派生类对象时,非虚函数的函数定义与通过派生类指针初始化的派生类对象的函数定义不同?无论是基类指针还是派生类指针,我们调用“new Derived”时不应该初始化相同类型的对象吗?

最佳答案

函数 F() 不是虚函数,这意味着函数调用将被静态调度到指针/引用的静态类型中的版本,而不是让它在运行时查找什么对象的动态类型确实是。

如果您限定您感兴趣的变体,您可以从指向 Derived 的指针访问相同的函数:

pDerived->Base::F();

关于c++ - 为什么通过基类指针初始化派生类与通过派生类指针初始化不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27805131/

相关文章:

c# - 在 C++ 中实现接口(interface)?

javascript - 使用 JavaScript 中的动态事件优化 'Mediator' 模式 (V8)

c++ - 有没有一种方法可以创建驻留在另一个类中的类的实例?

c++ - 检索叶目录

JavaScript 获取对象的原型(prototype)

java - 如何在java中添加约束来扩展泛型类?

c++ - 错误 : template argument required for 'struct List'

c++ - 结束迭代器和段错误

c++ - 纯虚函数和二进制兼容性

c++ - Boost 图形库多态捆绑属性