概念
虚函数
在类的成员函数定义前加 virtual
关键字,该函数将被作为虚函数。虚函数被继承后仍为虚函数。虚函数的在子类中可以被override(覆盖
)、overload (重载
)
virtual string toString(){
}
纯虚函数
纯虚函数除了有virtual
关键字外,还令它等于0,以表为纯虚函数。拥有纯虚函数的类称为 抽象类
。抽象类不能
被实例化。类的继承往往越往后越具体,相反地,越往祖先越抽象,以至于没法实例代,其实也根本没必要实例化。按照某本书上所说,之所以定义抽象类,是为了给以后的子类留下公共接口。我想有一定道理。
virtual string toString()=0;
一般地,我们不希望纯虚函数的构造函数暴露。所以我们把构造函数设为 protected
class test {
int property1;
int attribute2;
virtual string toString() = 0;
protected:
test() {}
test(int p1, int p2) {
property1 = p1;
attribute2 = p2;
}
};
纯虚函数被继承后为 虚函数
,请看下例。我们并没有给类 sun
类中的 toString()
函数 virtual关键字却实现了多态*,可见其从test类中继承了的toString()函数为虚函数。
#include<iostream>
#include<string>
using namespace std;
class test {
virtual string toString() = 0;
};
struct child:test {
string toString() {
return "ccc";
}
};
struct sun:child
{
string toString() {
return "sss";
}
};
int main() {
sun s;
child* c;
c = &s;
cout<<c->toString()<<endl;
system("pause");
}
结果:
注意
重载函数虽同名,但其实是不同的函数,我们让其中一种成为虚函数或者纯虚函数,其它的同名函数(如果其它的都不加virtual)并不会成为虚函数或者纯虚函数。在子类中,若重载了继承过来的虚函数,那么新的重载形式(即你的在子类中定义而在父类中没有的同名函数)的函数不会是虚函数。在此就不再实验,读者自证之。