IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++纯虚函数和ADT过程 -> 正文阅读

[C++知识库]c++纯虚函数和ADT过程

什么是纯虚函数?

纯虚函数也是虚函数(特殊的虚函数)

????????纯虚函数没有函数体

? ? ? ? 只能在类中函数这样写,把这样的函数叫纯虚函数

virtual void print()= 0;//在类中函数 这样写法 或者 原来的虚函数不想写函数体直接=0就是纯虚函数

本质就是重写过程?--- 用了别人的框架,别人把具体功能实现了,想要改变某些属性就需要重写

例:mfc中创建窗口的过程父类中已经写好了,但是创建的窗口是默认窗口大小,作为用户可能不需要默认大小,想修改宽高--->提供了一个纯虚函数instance用来初始化数据,重写这个函数,在这个函数中设置窗口的属性

什么是抽象类?

抽象类: 具有至少一个纯虚函数的类,叫做抽象类

  • 抽象类不能构建对象

  • 抽象类可以构建对象指针

  • 纯虚函数一般写为公有属性---要实现多态? ?tip:如果只在类中调用,可以写为保护属性

  • 抽象类不能在类中声明在类外实现

抽象类不能在类中声明在类外实现

//抽象类
class Parent 
{
public:
	virtual void print();		
protected:
};
void Parent::print()=0;    //错误

?抽象类不能构建对象,可以构建对象指针

//抽象类
class Parent 
{
public:
	virtual void print()= 0;		//纯虚函数 无函数体
protected:
};
void testAbstract() 
{
	//Parent object;  抽象类不能构建对象
	Parent* parent = nullptr;    //但是能够构建指针
}

模拟一个栈的实现过程

  • 入栈、出栈

  • 获取栈元素

  • 判断栈是否为空

  • 获取栈的大小

/* 纯虚函数就是做ADT(abstract data type 抽象数据类型) 过程 */

做好的框架,测试代码写好了,剩下实现功能的代码让别人去实现

//stack  栈
class stack 
{
public:
	//抽象一个类,已经知道栈的基本操作,父类中所有的操作描述好
	virtual void push(int data) = 0;
	virtual void pop() = 0;
	virtual int top() const = 0;
	virtual bool empty() const = 0;
	virtual int size() const = 0;
};
//子类想要创建对象,必须重写父类的纯虚函数
//ADT: 具有强迫性,所有子类重写函数必须和父类的一模一样(函数体不一样),如果不一样会报错
class arrayStack :public stack     //数组栈---用数组实现一个栈
{
public:
	void push(int data) //入栈---入一个整数
	{
		
	}
	void pop()          //出栈
	{

	}
	int top() const     //获取栈最上面的元素
	{
		return  1;
	}
	bool empty() const  //判断是否为空
	{
		return true;
	}
	int size() const    //获取大小
	{
		return 1;
	}
	//可以增加别的函数---但是纯虚函数必须要写
	//可以增加别的数据成员
protected:
	int* array;    //数组栈---需要数组的指针
};
struct Node        //节点---用链表实现,需要结构体
{
	int data;
	Node* next;
};
//不管做什么栈,重写抽象类即可
class listStack :public stack     //链式栈---用链表实现一个栈
{
public:
	void push(int data)
	{

	}
	void pop()
	{

	}
	int top() const
	{
		return  1;
	}
	bool empty() const
	{
		return true;
	}
	int size() const
	{
		return 1;
	}
protected:
	Node* headNode;    //表头
};
void testStack(stack* pStack)  //测试代码---传入抽象类的指针
{
	pStack->push(1);    //入栈,入1
	while (!pStack->empty())   //判断栈是否为空
	{
		cout << pStack->top(); //如果不为空,获取栈的元素后,不断出栈
		pStack->pop();
	}
}

int main() 
{
//用方法调用,测试代码是一样的---和统一接口差不多
	testStack(new arrayStack);
	testStack(new listStack);
	Abtract();
	return 0;
}

?小知识:

  • 子类重写如果没有实现父类的方法,还是抽象类

  • ADT就是虚函数和多态的使用,只是用的是纯虚函数而已

  • 纯虚函数如果没有被重写,无论继承多少次都是纯虚函数

  • 虚函数无论继承多少次都是虚函数

如果没有实现纯虚函数,这个类永远都是抽象类,一般情况下,抽象类只被继承一次,因为一个类被继承多次后可能忘记哪个函数是纯虚函数

class A 
{
public:
	virtual void print() = 0;    //纯虚函数
protected:
};
class B :public A //A类继承产生B类,B类还是抽象类
{
public:
	
};
class C :public B //B类再产生一个类,C类也是抽象类
{
public:
	
};
void Abtract() 
{
	//B b;    B类没有重写不能构造对象
	
}

重写B类后,C类能构建对象

class A 
{
public:
	virtual void print() = 0;    //纯虚函数
protected:
};
class B :public A 
{
public:
void print() 
	{
		cout << "B" << endl;
	}
};
class C :public B 
{
public:
	
};
void Abtract() 
{    
    B b;    //B类重写后能构造对象
    C c;
	
}

纯虚函数也是虚函数的一种

在实现多态的时候,不需要virtual修饰

class A 
{
public:
	virtual void print() = 0;    //纯虚函数
protected:
};
class B :public A 
{
public:
void print() 
	{
		cout << "B" << endl;
	}
};

class C :public B 
{
public:
	void print() 
	{
		cout << "C" << endl;
	}
};
void Abtract() 
{
	//B b;
	C c;  //一般抽象类只被继承一次就重写
	B* pb = new C;  //父类指针用子类对象初始化
	pb->print();    //虚函数无论被继承多少次,都是虚函数,有无virtual,都存在一个虚函数
                    
}
int main() 
{

	Abtract();    /*输出:C    子类对象初始化父类指针有virtual看对象类型,没有virutal
                               看指针类型,这里看的是对象类型*/
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-07 11:51:13  更:2021-12-07 11:51:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:14:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码