一、抽象类的标志:一个类的成员函数是纯虚函数
纯虚函数的写法virtual void fun() = 0;纯虚函数没有函数体。
子类继承抽象类的时候必须重写纯虚函数,如果不重写,子类也不能创建对象。
下面通过代码演示:
抽象类: Father
class Father {
public:
virtual string getClassName() = 0;
};
如果在main函数中创建一个对象,Father f1; //编译时一定报错
接下来创建个子类Son继承Father,再创建个GrandSon类继承Son
class Son : public Father {
public:
virtual string getClassName() override
{
return "Son";
}
};
class GrandSon : public Son{
public:
virtual string getClassName() override
{
return "Grandson";
}
};
无论是Son类还是GrandSon类都必须实现继承到的虚函数。否则无法创建对象
现在写一个打印函数,参数是抽象类的指针,函数功能是调用类中的getClassName()。
void print(Father *obj )
{
cout<<obj->getClassName()<<endl;
}
在main函数中调用
int main()
{
GrandSon *g = new GrandSon;
Son *s = new Son;
print(s);
print(g);
return 0;
}
在打印时会根据虚函数表指向的函数去运行,所以最终结果如下
特别注意print的参数不能是抽象类的对象,必须是指针,以下写法是错的
void print(Father obj )
{
cout<<obj.getClassName()<<endl;
}