三金兄的自留地儿

导航

虚函数(一)

#include <iostream>
using namespace std;

class CShape
{
public:
	virtual	void say(){cout << "shape\n";} 
};

class CTriangle:public CShape
{
public:
	virtual void say(){cout << "triangle\n";}
};

class CCircle:public CShape
{
public:
	virtual void say(){cout << "circle\n";}
};

class CSquare:public CShape
{
public:
	virtual void say(){cout <<"square\n";}
};

int main()
{
	CShape ashape;
	CTriangle atriangle;
	CCircle acircle;
	CSquare asquare;
	CShape *pshape[4] = {&ashape,&atriangle,&acircle,&asquare};
	int i;
	for(i=0; i<4; i++)
	{
		pshape[i]->say();
	}
	return 0;
}

总结:

1.虚函数实现了多态性,多态其实就是把接口和实现进行分离。

2.含有虚函数的类中,编译器会在其对象的内存中放入vptr这样一个指针,这个指针指向一张虚函数表vtable。可以把它想象成一个数组,然后向这个数组依据虚函数在类中的声明次序依次填入函数指针,函数指针指向要调用的函数。
3当我们在派生类中改写虚函数时,vtable就改变了,表中的函数指针不再指向基类的函数,而是派生类的函数。

posted on 2011-02-15 15:17  三金兄的自留地儿  阅读(219)  评论(0编辑  收藏  举报