C++类和对象——多态详解

这篇具有很好参考价值的文章主要介绍了C++类和对象——多态详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.多态的基本语法

2.多态的原理剖析

示例:计算机类 

3.纯虚函数和抽象类

示例:制作饮品

4.虚析构和纯虚析构 

示例:电脑组装


1.多态的基本语法

C++类和对象——多态详解,c++,类和对象,开发语言,多态

代码示例:

#include<bits/stdc++.h>
using namespace std;

class music
{
public:
//加virtual实现晚绑定
	virtual void listen()
	{
		cout << "listen music" << endl;
	}
};

class rock : public music
{
public:
	void listen()
	{
		cout << "listen rock" << endl;
	}
};

//不加virtual是地址早绑定
//如果想要听rock就应该让地址晚绑定,或者说在运行阶段进行绑定
void dolisten(music &m)
{
	m.listen();
}

int main()
{
	rock r;
	dolisten(r);
	
	return 0;
}

 C++类和对象——多态详解,c++,类和对象,开发语言,多态

C++类和对象——多态详解,c++,类和对象,开发语言,多态

2.多态的原理剖析

空类的大小为1 

加了virtual后会变为4或8个字节,这恰好是一个指针的大小

#include<bits/stdc++.h>
using namespace std;

class music
{
public:
//加virtual实现晚绑定
	virtual void listen()
	{
		cout << "listen music" << endl;
	}
};

class rock : public music
{
public:
	void listen()
	{
		cout << "listen rock" << endl;
	}
};

//不加virtual是地址早绑定
//如果想要听rock就应该让地址晚绑定,或者说在运行阶段进行绑定
void dolisten(music &m)
{
	m.listen();
}

int main()
{
	rock r;
	cout << sizeof(rock) << endl;
	
	return 0;
}

C++类和对象——多态详解,c++,类和对象,开发语言,多态 

vfptr是一个虚函数(表)指针

当子类重写父类的虚函数,子类中的虚函数表位置会替换成子类的虚函数地址

简单理解:就是父类会将它的函数继承给它的子类,但当子类使用virtual(多态后)会将父类继承给它的覆盖掉

多态使用条件:父类的指针或者引用指向子类对象

示例:计算机类 

C++类和对象——多态详解,c++,类和对象,开发语言,多态

#include<bits/stdc++.h>
using namespace std;

class calculator
{
public:

	virtual int getresult()
	{
		return 0;
	}
	
	int x;
	int y;
};

class addcalculator : public calculator
{
public:

	int getresult()
	{
		return x + y;
	}
};

class subcalculator : public calculator
{
public:

	int getresult()
	{
		return x - y;
	}
};

int main()
{
	//多态实现计算机的加法和减法
	calculator *c = new addcalculator;
	c -> x = 50,c -> y = 60;
	cout << c -> getresult() << endl;
	delete c;
	
	c = new subcalculator;
	c -> x = 60,c -> y = 50;
	cout << c -> getresult() << endl;
	delete c;
	
	return 0;
}

 C++类和对象——多态详解,c++,类和对象,开发语言,多态

3.纯虚函数和抽象类

 

 

#include<bits/stdc++.h>
using namespace std;

class base
{
public:
	
	virtual void func() = 0;
};

class son : public base
{
public:

	virtual void func()
	{
		cout << "func函数调用" << '\n';
	}
};

int main()
{
	base *b = new son;
	b -> func();
	delete b;
	
	return 0;
}

 C++类和对象——多态详解,c++,类和对象,开发语言,多态

示例:制作饮品

 

#include<bits/stdc++.h>
using namespace std;

class drinking
{
public:

	//煮水
	virtual void boil() = 0;
	
	//冲泡
	virtual void brew() = 0;
	
	//倒入杯中
	virtual void pourintocup() = 0;
	
	//加入佐料
	virtual void addseasoning() = 0;
	
	//制作饮品
	void makedrinking()
	{
		boil();
		brew();
		pourintocup();
		addseasoning();
	}
};

class coffee : public drinking
{
public:
	//煮水
	virtual void boil(){
		cout << "烧开水" << endl;
	}
	
	//冲泡
	virtual void brew(){
		cout << "加咖啡粉" << endl;
	}
	
	//倒入杯中
	virtual void pourintocup(){
		cout << "倒入杯中" << endl;
	}
	
	//加入佐料
	virtual void addseasoning(){
		cout << "加糖,加牛奶" << endl;
	}
	
};

void make(drinking *d)
{
	d -> makedrinking();
	delete d;
}

int main()
{
	//开始做咖啡
	make(new coffee);
	
	return 0;
}

 C++类和对象——多态详解,c++,类和对象,开发语言,多态

4.虚析构和纯虚析构 

C++类和对象——多态详解,c++,类和对象,开发语言,多态

C++类和对象——多态详解,c++,类和对象,开发语言,多态

#include<bits/stdc++.h>
using namespace std;

class animal
{
public:
	animal()
	{
		cout << "animal构造函数调用" << endl;
	}
	
	//利用虚析构解决父类指针释放子类对象时不干净的问题
	// virtual ~animal()
	// {
		// cout << "animal虚析构函数调用" << endl;
	// }
	
	virtual ~animal() = 0;
	
	//纯虚析构,需要声明也需要实现
	//有了纯虚析构之后,这个类也属于抽象类,无法实例化对象
	virtual void speak() = 0;
};

animal::~animal()
{
	cout << "animal的纯虚构函数调用" << endl;
}

class cat : public animal
{
public:
	cat(string name)
	{
		cout << "cat构造函数调用" << endl;
		this -> name = new string(name);
	}
	
	virtual void speak()
	{
		cout << *name << "在说话" << endl;
	}
	~cat()
	{
		cout << "cat析构函数调用" << endl;
		if(name != NULL)
		{
			delete name;
			name = NULL;
		}
	}
	string *name;
};

int main()
{
	animal *a = new cat("Tom");
	a -> speak();
	delete a;
	
	return 0;
}

C++类和对象——多态详解,c++,类和对象,开发语言,多态 

 C++类和对象——多态详解,c++,类和对象,开发语言,多态文章来源地址https://www.toymoban.com/news/detail-835857.html

示例:电脑组装

C++类和对象——多态详解,c++,类和对象,开发语言,多态

#include<bits/stdc++.h>
using namespace std;

class cpu
{
public:

	virtual void calculator() = 0;
};

class videocard
{
public:

	virtual void display() = 0;
};

class memory
{
public:

	virtual void storage() = 0;
};

class computer
{
public:

	computer(cpu *c,videocard *v,memory *m)
	{
		this -> c = c;
		this -> v = v;
		this -> m = m;
	}
	
	void make()
	{
		c -> calculator();
		v -> display();
		m -> storage();
	}
	
	~computer()
	{
		if(c != NULL)
		{
			delete c;
			c = NULL;
		}
		
		if(v != NULL)
		{
			delete v;
			v = NULL;
		}
		
		if(m != NULL)
		{
			delete m;
			m = NULL;
		}
	}
	
private:

	cpu *c;
	videocard *v;
	memory *m;
};

class intelcpu : public cpu
{
public:

	virtual void calculator()
	{
		cout << "intelcpu" << endl;
	}
};

class amd : public videocard
{
public:

	virtual void display()
	{
		cout << "amdvideocard" << endl;
	}
};

class kingston : public memory
{
public:

	virtual void storage()
	{
		cout << "kingstonmemory" << endl;
	}
};

int main()
{
	cpu *c = new intelcpu;
	videocard *v = new amd;
	memory *m = new kingston;
	
	computer *com = new computer(c,v,m);
	com -> make();
	delete com;
	
	return 0;
}

 

到了这里,关于C++类和对象——多态详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++类和对象-多态->案例1计算器类、案例2制作饮品、案例3电脑组装需求分析和电脑组装具体实现

    #includeiostream using namespace std; #includestring //分别利用普通写法和多态技术实现计算器 //普通写法 class Calculator { public:     int getResult(string oper)     {         if (oper == \\\"+\\\") {             return m_Num1 + m_Num2;         }         else if (oper == \\\"-\\\") {             return m_Num

    2024年02月20日
    浏览(42)
  • 【C++】面向对象---多态(万字详解)

           🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️文章专栏:✈️小林的C++之路       🛰️欢迎关注:👍点赞🙌收藏✍️留言       今天给大家讲解多态,多态是面向对象的一个重要内容。也非

    2024年02月01日
    浏览(40)
  • 详解C++类和对象(下篇)

    目录 一,再谈构造函数  1.1 构造函数体赋值  1. 2 初始化列表  1.21 自定义类型成员  1.22  const 成员变量 1.23 引用成员变量   1. 24 初始化列表的“坑” 1. 3 explicit   二,static 成员 2.1 概念  2.2 特性  三, 友元 3. 1 友元函数 3. 2 友元类  特点:  3. 3 内部类(了解)

    2024年02月04日
    浏览(46)
  • C++类和对象基础知识详解

    1.一切皆是对象。如下图: ·女人是一个对象 ·鞋子是一个对象 ·包包是一个对象 ·衣服是一个对象 ·裤子是一个对象 ·手链是一个对象 … 这里人这个对象,由鞋子、包包、衣服、 裤子、手链等对象组成。 3.每个对象都有: a)数据(描述对象的属性) b)函数(行为操作代码

    2023年04月12日
    浏览(43)
  • C++ ------类和对象详解六大默认成员函数

    如果我们定义一个类,然后这个类中什么也没有。那么这里的类就什么也没有吗?其实不然,任何类在里面什么都不写时,编译器都会生成6个默认成员函数。 用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 六个默认成员函数 我们来看一个Date类 观察上述代

    2024年02月15日
    浏览(51)
  • 【030】C++类和对象之友元(friend)详解

    💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。 👉 🎖️ CSDN实力新星,社区专家博主 👉 🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、

    2024年02月09日
    浏览(51)
  • 【C++】类和对象详解(类的使用,this指针)

    提示:这里可以添加本文要记录的大概内容: 在计算机编程领域,程序设计的方法论不断演化,从最初的面向过程到如今更为强大而灵活的面向对象。本文将深入探讨C++中关于类和对象的概念,为读者提供对面向对象编程的深刻理解。 提示:以下是本篇文章正文内容,下面

    2024年02月02日
    浏览(40)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(74)
  • 一文带你入门C++类和对象【十万字详解,一篇足够了】

    本文字数较多,建议电脑端访问。不多废话,正文开始 从本文开始,我们就要正式来学习C++中的类和对象了,本文我将带你一步步 从C语言的结构体 struct 到C++的类 class ,真正搞懂有关C++的 面向对象的三大特征之一 —— 封装 作为读者,可能你正在学习C语言,亦或者已经开

    2024年02月05日
    浏览(47)
  • Python-面向对象:面向对象、成员方法 、类和对象、构造方法、魔术方法、封装、继承、类型注解、多态(抽象类(接口))

    当前版本号[20230806]。 版本 修改说明 20230806 初版 生活中数据的组织 学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生自己填, 易出现内容混乱 但当改为登记表,打印出来让学生自行填写, 就会整洁明了 程序中数据的组织 在程序中简单使用变量来记录学

    2024年02月14日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包