虚函数(一)
#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就改变了,表中的函数指针不再指向基类的函数,而是派生类的函数。