C++ 纯虚函数和抽象类(自学笔记,可能有错)

陌路散爱 提交于 2020-02-05 10:54:46

什么是纯虚函数

(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;
}

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!