今天遇到这么个问题,程序中定义了一个借口类,成员函数全是纯虚函数,我写的子类继承了这个接口类,但是报错提示说:无法实例化抽象类!
原因是这样的:子类继承父类时,必须重写父类的纯虚函数,函数名、返回类型、参数个数和类型都不能改。若父类中的虚函数自己有定义,子类也可以不重写。
测试如下:
头文件test.h
#pragma once
#include "iostream"
using namespace std;
class FATHER
{
public:
virtual void print(int a)=0; //纯虚函数,子类需重写。
//virtual void print(int a);
};
class CHILD : public FATHER
{
public:
int print(double d);
};
可以看到报错了:纯虚函数没有定义!
将子类的print函数的返回值和参数类型保持和父类一致就可以编译通过了。
当父类的成员函数式虚函数时,即父类对虚函数有定义时,子类可以进行重载,不需要完全和父类的虚函数保持一致,如下:
#pragma once
#include "iostream"
using namespace std;
class FATHER
{
public:
//virtual void print(int a)=0; //纯虚函数,子类需重写。
virtual void print(int a);
};
class CHILD : public FATHER
{
public:
int print(double d); //子类无需和父类的虚函数保持一致,当然子类也可以不继承虚函数。
};
编译通过,如下: