虚函数(一)
#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,âle,&asquare};
int i;
for(i=0; i<4; i++)
{
pshape[i]->say();
}
return 0;
}
总结:
1.虚函数实现了多态性,多态其实就是把接口和实现进行分离。
2.含有虚函数的类中,编译器会在其对象的内存中放入vptr这样一个指针,这个指针指向一张虚函数表vtable。可以把它想象成一个数组,然后向这个数组依据虚函数在类中的声明次序依次填入函数指针,函数指针指向要调用的函数。
3当我们在派生类中改写虚函数时,vtable就改变了,表中的函数指针不再指向基类的函数,而是派生类的函数。
浙公网安备 33010602011771号