繁体   English   中英

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

[英]Why is initialization of derived class through a base class pointer different from that through a derived class pointer?

#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

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

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

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

pDerived->Base::F();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM