问题:C++虚拟函数的简单范例

本程序通过VC++ 6.0编译与测试,两段程序分别演示了不使用虚析构函数和使用虚析构函数的结果,具体代码如下:

//不使用虚拟函数
#include <iostream>
using namespace std;

class Base
{
public:
	//virtual //不同点,注意,此时虚拟函数被注释掉了
	void func()
	{
		cout<<"Base function!"<<endl;
	}
};

class Derived: public Base
{
public:
	void func()
	{
		cout<<"Derived function!"<<endl;
	}
};

void foo(Base & b)
{
	b.func();
}

int main()
{
	Base b;
	Derived d;
	Base *p=&d; //父类指针指向子类对象
	Base &br=d; //父类引用指向子类对象
	b.func();//调用父类版本
	d.func();//调用子类版本
	p->func(); //父类指针调取父类版本
	br.func();//父类引用调取父类版本
	foo(d);//把子类对象d传递给父类引用,调取父类版本
	return 0;
}

程序运行结果:


//使用虚拟函数
#include <iostream>
using namespace std;

class Base
{
public:
	virtual void func() //注意,此时使用了虚拟函数
	{
		cout<<"Base function!"<<endl;
	}
};

class Derived: public Base
{
public:
	void func()
	{
		cout<<"Derived function!"<<endl;
	}
};

void foo(Base & b)
{
	b.func();
}

int main()
{
	Base b;
	Derived d;
	Base *p=&d; //父类指针指向子类对象
	Base &br=d; //父类引用指向子类对象
	b.func();//调用父类版本
	d.func();//调用子类版本
	p->func(); //指针指向对象为子类,调用子类版本
	br.func();//引用传递对象为子类,调用子类版本
	foo(d);//把子类对象d传递给父类引用,调取子类版本
	return 0;
}

程序运行结果:


总结:有虚拟函数时父类指针或引用根据所指向的对象的类型来确定调用哪个版本的函数