还是先看示例程序,用代码说话:
#include <iostream>
using namespace std;
class A
{
public:
};
class B : public A
{
public:
};
int main(void)
{
}
当然在实际编程中,没有人会象上面那样写程序的。运行结果:
再来一个虚函数和多态性例子:
#include <iostream>
using namespace std;
class Parent
{
public:
};
class Child : public Parent
{
public:
};
int main(void)
{
}
输出结果:
我们知道如果一个类声明了虚函数,那么编译器就会在其声明的对象中的开始部分(至少对于VC而言是这样的)增加一个vfptr,vfptr指向虚函数表。如果没有声明虚函数,那么这个vfptr就不存在。Parent* p是声明了一个指向Parent对象的指针,Parent没有声明虚函数的情况下,p所指向的内容并不包括vfptr,当用new Child(2)给它赋值时,除了将Child中的Parent suboject以memberwise的方式拷贝给p所指向的Parent对象外,什么也没有做。因此p->haveFun()调用的是Parent中的haveFun函数;
如果在Parent中haveFun是虚函数,那么当Parent* p = new Child(2);执行时,就会把Child对象的vfptr和Child对象中包含的Parent subobject一同以memberwise的方式拷贝给p所指向的对象。此后,p所指向vfptr是Child对象的vfptr,因此再调用p->havefun()时,就会调用Child类中的haveFun函数。另外值得一提的是,如果不进行explicit形式的类型转换p所指的对象只有vfptr(由vfptr得到虚函数haveFun)和Parent::parent,在VC中的表现如下: