说重点:纯虚函数和抽象类的相关内容

2 篇文章 0 订阅
2 篇文章 1 订阅
本文详细讲解了C++中抽象类与纯虚函数的概念,阐述了它们如何支持接口定义和子类实现差异化。通过实例演示了抽象类的使用,包括抽象类的指针和引用,并解释了其限制。重点强调了派生类未覆盖纯虚函数的情况及其分类。
摘要由CSDN通过智能技术生成

基类往往用于一些抽象的概念。就是说仅说明一个公共界面,而有派生类提供各自的实现版本。在这种情况下,基类的有些函数没有定义是很正常的,但要求派生类必须重新定义这些虚函数,以使派生类有意义。为此,C++i引用了纯虚函数的概念。

一个具备纯虚函数的基类称为抽象类。抽象类机制支持一般概念的表示,也用于定义接口。

纯虚函数

纯虚函数是基类说明的虚函数,他在该基类之中没有实现定义,要求所以派生类都必须定义自己的版本。纯虚函数的说明形式如下:virtual 类型 函数名(参数表)=0;赋值为0,是表示没有实现定义。虚函数的实现在他的派生类中定义。

以下举个简单的例子

//figure
#include<iostream>
using namespace std;
class Figure
{
	protected:
		doubut x,y;
	public:
		void set_dim(double i,double j=0)
		{
			x=i;
			y=j;
		}
		virtual void show_area()const=0;
};
class Tringle:public Figure
{
	public:
		void show_area()const
		{
			cout<<"Triangke with hight"<<x<<"and base"<<y;
			cout<<"has an area of"<<x*0.5*y<<"\n";
		}
 };
class Sequare:public Figure
{
	public:
		void show _area()const
		{
			cout<<"Square with dimension"<<x<<"*"<<y;
			cout<<"has an area of "<<x*y<<"\n";
		}
};
class Circle:public figure
{
	public:
		void show_area()const
		{
			cout<<"Circle with redius"<<x;
			cout<<"has an area of"<<3.14*x*x<<"\n";
		}
};
//ex8_8.cpp
#include"figure.h"
int main()
{
	Triangle t;
	Square s;
	Circle c;
	t.set_dim(10.0,5.0);
	t.show_area();
    #include"figure.h"
int main()
{   
	Figure *p;
	Triangle t;
	Square s;
	Circle c;
	p.set_dim(10.0,5.0);
	t.show_area();;
	a.set_dim(10.0,5.0);
	a.show_area();
	c.set_dim(9.0);
	c.show_area(); 
 } 

Triangke with hight 10 and base 5 has an area of 25

Square with dimension 10*5 has an area of 50

Circle with redius  9 has an area of 254.34

我们可以看到在基类之中定义了纯虚函数(virtual void show_area()const=0;),纯虚函数没有在基类之中实现定义。还有,显而易见,通过基类Figure派生出的三个派生类之中对 void show_area()const=0进行了各自的定义。main函数通过不同对象的调用派生show_area()

函数的不同实现版本。

抽象类

抽象类至chun纯虚函数,记住,是至少,就是绝对有纯虚函数。像上面例子中的Figure就有一个纯虚函数,它就是一个抽象类。定义了纯虚函数的派生类叫具体类,具体类,具体,具体说明纯虚函数的作用,对纯虚函数进行定义。

我们知道一个不论什么东西,它都会受到限制。没有什么东西是不受限制的。那么纯虚函数也受到c++的限制。

1 抽象类只能做其他类的基类 2 抽象类不能建立对象 3抽象类不能做参数类型,函数返回类型或显示类型转化。但是,可以说明抽象类的指针和引用。

感觉这么理解有点困难,别慌,来,咋举个例子看看。

对Figure抽象类的使用

Figure x ;//错误 抽象类不能建立对象

Figure *p;//可以说明抽象类的指针

Figure f()//错误 抽象类不能作为返回类型

void g(Figure);//错误 抽象类不能作为参数类型

Figure &h(Figure &);//正确,可以说明抽象类的引用

抽象类的指针和抽象类的引用是一个重点。我们先来讲抽象类的指针。

我们直接以上面的代码进行改动

#include"figure.h"
int main()
{   
	Figure *p;//纯虚函数的指针
	Triangle t;
	Square s;
	Circle c;
	p=&t;//调用地址
	p->set_dim(10.0,5.0);//指向
	p->show_area();
	p=&s;
	p->set_dim(10.0,5.0);
	p->show_area();
	p=&c;
	p->set_dim(9.0);
	p->show_area();
 } 

这么一看其实用纯虚函数的指针也挺简单的

接下来就是用抽象类引用的使用了

#include<iostream>
using namespace std;
class Number 
{
	public:
	Number(int i)
	{
		val=i;
	}
	virtual void show()const=0;//纯虚函数
	protected:
	int val;
};
class Hex:public Number
{
	public:
	Hex(int i):Number(i){ }
    void show()const//别忘记后面的const
	{cout<<"Hex="<<val<<endl;} 
};
class Dex:public Number
{
	public:
	Dex(int i):Number(i) { }
    void show()const
	{cout<<"Dex="<<val<<endl;}
};
class Oct:public Number
{
	public:
	Oct(int i):Number(i) { }
	void show()const
	{
		cout<<"Oct="<<val<<endl;
	}
};
void fun(Number &n)//普通函数定义引用抽象类的引用参数
{n.show();}
int main()
{
	Dex n1(50);
	fun(n1);//Dex::show();
	Hex n2(70);
	fun(n2);//Hex::show()
	Oct n3(29);
	fun(n3);//Oct::show()
}

Dec=50

Hex=70

Oct=29

 好了,最主要的提示我备注在了代码上,你要尝试自己去理解代码的运行。

假设一个派生类继承了一个纯虚函数的基类,但是它不对其进行重定义,那么这个派生类还是抽象类吗?

是的,它还是抽象类。切记

那么今天就结束了。

祝你好运,也祝我好运。好好生活。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daydr

来吧,尽情的打赏我啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值