#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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句