gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:50:12 24 4
gpt4 key购买 nike

#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/

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