距离上次用C++写代码已经有大半年了,有些东西淡忘了许多,或者与JAVA进行了混淆。这次理清几个概念吧 。虚函数,纯虚函数,抽象类。
先看虚函数,虚函数是用来干什么的呢 举个例子
getsum()声明为普通成员函数:
#include<iostream> using namespace std; class F { public: int getsum() { return 0; } }; class C:public F { private: int a,b; public: C(int c,int d):a(c),b(d){} int getsum() { return (a+b); } }; int main() { F* f=new C(1,2); cout<<f->getsum()<<endl; return 0; }
输出结果是 :0
getsum()声明为虚函数:
#include<iostream> using namespace std; class F { public: virtual int getsum() { return 0; } }; class C:public F { private: int a,b; public: C(int c,int d):a(c),b(d){} virtual int getsum() { return (a+b); } }; int main() { F* f=new C(1,2); cout<<f->getsum()<<endl; return 0; }
输出结果为3。
虚函数和普通成员函数的区别很显然,虚函数是为了实现基类指针能够根据实际对象的类型来调用相应方法(具体实现是由虚函数表)而不是根据指针类型。
那么,将getsum()声明为纯虚函数:
#include<iostream> using namespace std; class F { public: virtual int getsum()=0; }; class C:public F { private: int a,b; public: C(int c,int d):a(c),b(d){} virtual int getsum() { return (a+b); } }; int main() { F* f=new C(1,2); cout<<f->getsum()<<endl; return 0; }
输出结果也为3.
实际上,如果一个类的成员函数至少一个是纯虚函数那么这个类就为抽象类(相当于JAVA里的接口),所有继承这个类的子类必须要显式的实现这个这个方法(纯虚函数),否则这个子类依旧为抽象类。抽象类不能被实例化。
总结一下:
只要一个类的成员函数有纯虚函数,那么这个类就不能被实例化,所有继承这个类的子类必须实现这个纯虚函数,否则依旧不能被实例化,而虚函数则无此要求。虚函数和纯虚函数都是为了实现多态。