什么是纯虚函数
(1) 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本。
(2) 纯虚函数为各派生类提供一个公共界面(接口的封装和设计、软件的模块功能划分)
(3) 纯虚函数说明形式:
virtual 类型 函数名(参数表) = 0;
(4)一个具有纯虚函数的基类被称为抽象类
引入纯虚函数的原因
(1) 为了方便使用多态特性,我们常常需要在基类中定义虚函数。
(2) 在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
为了解决上述问题,引入了纯虚函数的概念,即 将函数定义为纯虚函数。
抽象类
(1) 抽象类不能实例化但可以创建一个抽象类的指针或是引用,抽象类不能作为返回类型、参数类型。
(2) 除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。
在派生类实现该纯虚函数后,定义抽象类对象的指针,并指向或引用子类对象。
(3) 抽象类的唯一用途是为派生类提供基类,纯虚函数的作用是作为派生类中的成员函数的基础,并实现动态多态性。
#include <iostream>
using namespace std;
class father// 拥有纯虚函数,因此这个类成为了抽象类
{
public:
virtual void demo() = 0;
};
class child1 : public father //子类继承了抽象类
{
public:
void demo() //将纯虚函数实例化从抽象类继承的类,必须为每一个纯虚函数赋予功能。
{
cout << "i am child1" << endl;
}
};
class child2 :public father //子类继承了抽象类 但是没有赋予纯虚函数的功能,因此不能实例化,也是一个抽象类
{
public:
void fun()
{
cout << "调用了child2 的 fun()" << endl;
}
};
void paltform(father & f1) //这里引用 抽象类father
{
f1.demo();
}
int main()
{
child1 c1;
//child2 c2; //error
paltform(c1); //在派生类实现该纯虚函数后,定义抽象类对象的指针,并指向或引用子类对象。
return 0;
}
抽象类在多继承中的使用
(1) 多继承指的是一个类可以同时继承多个不同基类的行为和特征功能。
(2) 绝大多数面向对象语言都不支持多继承,绝大多数面向对象语言都支持接口的概念。
(3) C++中没有接口的概念,C++中可以使用纯虚函数实现接口,接口类中只有函数原型定义,没有任何数据的定义。
#include<iostream>
using namespace std;
class interface
{
public:
virtual void Printf() = 0;
};
class interface1: virtual public interface //接口1
{
public:
virtual int add(int a, int b) = 0;
virtual void _printf() = 0;
};
class interface2 : virtual public interface//接口2
{
public:
virtual int muti(int a, int b) = 0;
virtual void _printf() = 0;
};
//注意多继承的时候,每一个类前面都加权限(public)
class child : public interface1, public interface2
{
public:
int add(int a, int b)
{
cout << "执行add函数" << endl;
return a + b;
}
public:
int muti(int a, int b)
{
cout << "执行muti函数" << endl;
return a * b;
}
public:
void Printf()
{
cout << "调用了爷爷类的Printf函数" << endl;
}
void _printf()
{
cout << "_printf函数" << endl;
}
};
int main()
{
child c1;
interface * p = &c1;
p->Printf();
cout << endl;
interface1 * p1 = &c1;
p1->add(1, 2);
p1->_printf();
cout << endl;
interface2 * p2 = &c1;
p2->muti(3, 4);
p2->_printf();
return 0;
}
来源:CSDN
作者:洛阳鱼紫怡
链接:https://blog.csdn.net/weixin_42148156/article/details/104091543