在定义一个基类时, 应该把虚函数定义为protected: 类型, 这样基类的对象不能直接调用该接口。而把开放与否的控制权交给子类。在子类里如果把该接口重新定义为public则开放, 否则依然不对外开放。
在类的定义中, 如果是虚函数应该尽量定义其为保护类型。如果不是虚函数应尽量定义为共有类型。
虚函数的作用:
为什么要定义虚函数,是因为在设计基类的时候, 需要把不同子类的共同行为归结为一个接口,不同的子类可以重新去实现这个接口, 定义不同的行为细节。举个现实中的例子, 很多人都有手机了,手机大都具有发短消息的功能,定义为SendSM(), 而具体到不同的手机, 这个功能就有很大差别, 譬如有的可以发文本短信, 有的可以发"彩信", 更有的可以发“声音””视频“短信。那么我们在设计手机这个基类时,就很有必要把SendSM()这个功能接口定义为虚函数,当描述不同的手机时,具体的去定义到底发什么类型的短信。
C++里的多态特性,就是靠着虚函数实现的。
虚函数与纯虚函数的比较:
1 如果一个类里面有了一个或一个以上的纯虚函数, 那么这个类叫做”虚基类“。虚基类只能被重载,不能被实例化。而虚函数可以被实例化。
2 纯虚函数只能用来被继承接口。虚函数可以被用来继承接口和默认行为。
3 virual void SendSM() = 0; 纯虚函数
virual void SendSM(); 虚函数