纯虚函数与抽象类
一、纯虚函数
什么是纯虚函数?
纯虚函数是在基类中定义的一个虚函数,它在基类中没有具体的操作内容,是要在派生类中根据各自的需求定义。其声明格式为
| virtual 函数类型 函数名(参数表)=0 |
class Base2 :public Base1
{
public:void display()const;
};
void Base2::display()const
{
cout << "Base2::display()" << endl;
}
class Derived :public Base2
{
public:void display()const;
};
void Derived::display()const
{
cout << "Derived::display()" << endl;
}
void fun(Base1 *ptr)
{
ptr->display();
}
int main()
{
Base2 base2;
Derived derived;
fun(&base2);
fun(&derived);
return 0;
}
、、、

| 上述代码是在基类中设置了一个纯虚函数,在基类中并没有实际的具体内容,只声明了一个框架,在外部函数通过一个基类指针来调用不同派生类中的同名函数 |
如果将基类中的纯虚函数
virtual void display() const = 0; |
virtual void display() const |
此时再运行上述代码时系统会报出错误

这就是纯虚函数在面对基类中函数无实际意义时相对于虚函数存在的优点
注意:1、纯虚函数函数与虚函数的区别在于纯虚函数有“=0”,而虚函数没有。
2、基类中也可以对纯虚函数给出实现,但是这在派生类中也必须给出相同的函数将其覆盖,否则在编译时系统会报出无法实例化的错误。如下图,将上面代码稍加修改如下图
代码二、
、、、
#include
using namespace std;
class Base1
{
public:virtual void display() const=0 ;
};
void Base1::display()const//基类中给出纯虚函数的实现
{
cout << "Base1::display()" << endl;
}
class Base2 :public Base1
{
public:void show()const;//派生类中与基类中的函数不同不能将其覆盖
};
void Base2::show()const
{
cout << "Base2::display()" << endl;
}
class Derived :public Base2
{
public:void show()const;
};
void Derived::show()const//派生类中与基类中的函数不同不能将其覆盖
{
cout << "Derived::display()" << endl;
}
void fun(Base1 *ptr)
{
ptr->display();
}
int main()
{
Base2 base2;
Derived derived;
fun(&base2);
fun(&derived);
return 0;
}
、、、
在编译时系统报出如下错误


浙公网安备 33010602011771号