【发布时间】:2015-03-04 12:02:56
【问题描述】:
#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”时,不应该初始化相同类型的对象,无论是来自基类指针还是派生类指针?
【问题讨论】:
-
不是初始化不同。这是您通过指针访问非虚拟方法的事实。
-
@juanchopanza 你能详细说明一下吗?
-
那是C++的设计——没有自动虚函数。
-
将
pBase转换为Derived*看看会发生什么。
标签: c++ inheritance polymorphism virtual-functions