C++学习-多态性与虚函数

C++实验8报告多态性与虚函数 所使用的开发工具及环境: PC机一套 实验目的: (1)了解多态性的概念。 (2)了解虚函数的作用及使用方法。 (3)了解静态关联和动态关联的概念和川法。 (4)了解纯虚函数和抽象类的概念和用法。 实验内容: 1、分析程序运行结果,掌握虚函数的使用。 程序一: #include <iostream> using namespace std; class ONE { public: ... 阅读详情

多态性

概念:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。
作用:可以实现一个接口,多种方法
应用:多态性分为静态多态性和动态多态性,静态多态性即编译时的多态性,通过函数重载实现;动态多态性是运行时才确定操作所作用的对象,动态多态性通过虚函数(virtual function)实现;


例子:
建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。要求编写程序,重载运算符“<<”和“>>”,使之能用于输出以上类对象。

对于一个比较大的程序,应当分成若干步骤进行。先声明基类,再声明派生类,逐级进行,分步调试。

//首先实现基类point
#include <iostream>
using namespace std;

class point
{
public:
    point(float x=0, float y=0);//构造函数,初始化坐标(0,0)
    void setPoint(float, float);
    float getx() const {return x;}
    float gety() const {return y;}
    friend ostream & operator<<(ostream &, const point &);

protected:
    float x, y;
};

void point::setPoint(float a, float b)
{
    x = a;
    y = b;
}
point::point(float a, float b)
{
    x = a;
    y = b;
}
ostream & operator<<(ostream & output, const point & p)
{
    output << "[" << p.x << "," << p.y << "]" << endl;
    return output;
}
int main()
{
    point p(3.5, 6.4); 
    cout<<"x="<<p.getx()<< "   y=" << p.gety()<<endl;
    p.setPoint(1.1,3.2);
    cout << "pnew = " << p << endl;
}
//输出结果
x=3.5   y=6.4
pnew = [1.1,3.2]
//声明派生类circle
//派生类

class circle:public point
{
public:
    circle(float x=0, float y=0, float r=0);//构造函数
    void setRadius(float);//设置半径值
    float getRadius() const;
    float area() const;//计算圆面积
    friend ostream  &operator<<(ostream &, const circle &);//重载运算符<<,输入参数为一个输出流引用及circle对象引用

private:
    float radius;

};
//定义构造函数,对圆心坐标和半径初始化
circle::circle(float a, float b, float r):point(a,b),radius(r)
{

}

void circle::setRadius(float r)
{
    radius = r;
}
float circle::getRadius() const
{
    return radius;
}

ostream & operator<<(ostream & output, const circle & c)
{
    output << "Center = [" << c.x << "," << c.y<< "], r = " << c.radius << ", area = " << c.area() << endl;
    return output;
}

float circle::area() const
{
    float radius = getRadius();
    return 3.14159*radius*radius;
}

将int main(){}更改为:

int main()
{
    point p(3.5, 6.4); //p
    cout<<"x="<<p.getx()<< "   y=" << p.gety()<<endl;
    p.setPoint(1.1,3.2);
    cout << "pnew = " << p << endl;
    circle c(2.5, 6.4, 4.3);//建立circle对象,并给出圆心和半径
    cout << "origina circle:" << c.getx() << ", y = " << c.gety() << ", r = " << c.getRadius() << ", area = " << c.area() << endl;
    c.setRadius(7.0);
    c.setPoint(2.0, 2.0);
    cout << "new circle:" << c;
    point &pRef = c;
    cout << "pRef:" << pRef;
    return 0;
}
//运行结果
x=3.5   y=6.4
pnew = [1.1,3.2]

origina circle:2.5, y = 6.4, r = 4.3, area = 58.088
new circle:Center = [2,2], r = 7, area = 153.938
pRef:[2,2]

接下来再从派生类circle派生出cylinder类

//cylinder类
//增加高度属性
//声明circle的派生类cylinder
class cylinder:public circle
{
public:
    cylinder(float x=0, float y=0, float r=0, float h=0);//构造函数
    void setHeight(float);//设置圆柱高
    float getHeight() const;//获取圆柱高度
    float volume() const;//计算圆柱体积
    friend ostream & operator<<(ostream &, const cylinder &);

private:
    float height;//圆柱高度
};

cylinder::cylinder(float a, float b, float r, float h)
    :circle(a, b, r),height(h)
{

}

void cylinder::setHeight(float h)
{
    height = h;
}

float cylinder::getHeight() const
{
    return height;
}

float cylinder::volume() const
{
    float height = getHeight();
    float area = circle::area();
    return (area*height);
}
//重载运算符 <<
ostream & operator<<(ostream & output, const cylinder & cy)
{
    output << "Center = [" << cy.x << cy.y << "]" << ", r = " << cy.getRadius() << ", h = " << cy.height
           << "\narea = " << cy.area() << ", volume = " << cy.volume() << endl;
    return output;
}

将int main(){}更改为:

int main()
{
    //point test
    point p(3.5, 6.4); //p
    cout<<"x="<<p.getx()<< "   y=" << p.gety()<<endl;
    p.setPoint(1.1,3.2);
    cout << "p-new = " << p << endl;

    //circle test
    circle c(2.5, 6.4, 4.3);//建立circle对象,并给出圆心和半径
    cout << "origina circle:x = " << c.getx() << ", y = " << c.gety() << ", r = " << c.getRadius() << ", area = " << c.area() << endl;
    c.setRadius(7.0);
    c.setPoint(2.0, 2.0);
    cout << "new circle:" << c;
    point &pRef = c;
    cout << "pRef:" << pRef;

    //cylinder test
    cylinder cy(3.2, 7.6, 7.5, 4.3);//建立cylinder对象,并给出圆心,半斤,高度
    cout << "original cylinder:x = " << cy.getx() << ", y = " << cy.gety() << ", r = " << cy.getRadius() << ", h = " << cy.getHeight() << endl;
    cy.setPoint(1.0, 1.0);
    cy.setRadius(3.0);
    cy.setHeight(6.5);
    cout << "new cylinder:" << cy;
    point &pRef1 = cy;
    cout << pRef1;//作为点输出
    circle &pRef2 = cy;
    cout << pRef2;//作为圆输出
    return 0;
}

输出:

x=3.5   y=6.4
p-new = [1.1,3.2]

origina circle:x = 2.5, y = 6.4, r = 4.3, area = 58.088
new circle:Center = [2,2], r = 7, area = 153.938
pRef:[2,2]
original cylinder:x = 3.2, y = 7.6, r = 7.5, h = 4.3
new cylinder:Center = [11], r = 3, h = 6.5
area = 28.2743, volume = 183.783
[1,1]
Center = [1,1], r = 3, area = 28.2743

上例的静态多态性是运算符重载引起的。可以看到,在编译时编译系统即可以判定应调用哪个重载运算符函数。稍后将在此基础上讨论动态多态性问题。


动态多态性通过虚函数实现:
虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

C++学习心得(3)多态性与虚函数 C++学习心得(3)多态性与虚函数 ——from 谭浩强.C++面向对象程序设计(第一版) 2014/10/13 6.1    多态性的概念     在C++中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。     面向对象的描述:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。即每个对象可以用自己的方式去响应共同的消息。 阅读详情

相关推荐

C++ 学习之路(11):多态性与虚函数

一、多态性: 1、概念: ①不同对象收到相同的消息时,产生不同的动作。即多态性。 ②即用相同的接口访问不同功能的函数,实现“一种接口,多种 方法” 2、多态可分为编译时的多态和运行时的多态 ①连编:即把函数名与函数体的程序代码连接(联系)在一起的过 程。

Rioer的博客 1000

第十周C++【任务3】建立一个Point(点)类,派生出一个Circle(圆)类,派生出一个Cylinder(圆柱体)类

【任务3】 (1)先建立一个Point(点)类,包含数据成员x,y(坐标点); (2)以Point为基类,派生出一个Circle(圆)类,增加数据成员 (半径); (3)再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。 要求编写程序,设计出各类中基本的成员函数(包括构造函数、析构函数、修改数据成员和获取数据成员的公共接口、用于输出的重载运算符“

pinktinda的专栏 2万+

从零到一:ASTER L2数据获取的实战避坑指南

本文提供了一份详细的ASTER L2数据获取实战指南,涵盖账号注册、环境配置、数据检索、下载故障排除及后处理等关键步骤。特别针对NASA EarthData平台的隐形门槛和常见陷阱,给出了实用解决方案,帮助科研新手高效获取地表温度数据,适用于环境监测和城市热岛效应分析等领域。

weixin_29061425的博客 519

Point类重载

<br />例12.1 先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。要求编写程序,重载运算符“<<”和“>>”,使之能用于输出以上类对象。<br />对于一个比较大的程序,应当分成若干步骤进行。先声明基类,再声明派生类,逐级进行,分步调试。<br />(1) 声明基类Point类<br />可写出声明基类Point的部分如下:<br

rtyytr的专栏 3476

安全虚拟化SEV简单介绍

安全虚拟化SEV简单介绍什么是SEV什么是SVMSME介绍SEV介绍总结 什么是SEV SEV是由AMD提出的安全虚拟化Secure Encrypted Virtualization技术的英文首字母的缩写。简单来说就是主内存控制器具备了加密功能可以对虚拟机内存数据进行保护。在真正介绍SEV之前,我们首先要弄清楚两个关键的基本概念:SVM、SME。下面先简单了解一下SVM和SME。 什么是SVM S...

artine的专栏 6391

深入瑞芯微SDK:手把手解析Uboot、Kernel到Rootfs的镜像生成与烧录

本文深入解析瑞芯微SDK中从Uboot、Kernel到Rootfs的镜像生成与烧录全流程,揭示编译背后的技术细节。通过详细分析SDK架构、镜像生成流水线、分区表定制、Rootfs构建及烧录科学,帮助开发者从会编译进阶到懂原理,掌握系统级开发的关键技术。

weixin_29193359的博客 274

C++之多态的一个例子

[例12.1] 先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。要求编写程序,重载运算符“<<”和“>>”,使之能用于输出以上类对象。 这个例题难度不大,但程序很长。对于一个比较大的程序,应当分成若干...

weixin_30509393的博客 594

从零开始学版图(二)-----------差分放大电路

从零开始学版图

m0_56112720的博客 8562

C++学习(九) 多态性与虚函数

文章目录1、多态性1.1、作用1.2、概念1.3、实现2、虚函数2.1、作用2.2、定义2.3、条件2.4、说明 1、多态性 1.1、作用 多态性的机制不仅增加了面向对象软件系统的灵活性,进一步减少了冗余信息,而且显著提高了软件的可重用性和可扩充性。多态性的应用可以使编程显得更简捷、更便利,它为程序的模块化设计又提供了一种手段。 1.2、概念 多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,从而可以使用相同的方式来调用这些具有不同功能的同名函数。 1.3、实现 1.31、多态可以划分为两

qq_45700814的博客 799

用PyTorch和snnTorch库5分钟搞定一个脉冲神经网络(SNN)手写数字识别Demo

本文详细介绍了如何使用PyTorch和snnTorch库快速搭建一个脉冲神经网络(SNN)手写数字识别Demo。通过模拟生物神经元的脉冲发放机制,SNN在低功耗场景中展现出独特优势。文章涵盖环境配置、数据预处理、模型构建、训练评估全流程,并提供了性能优化技巧和常见问题解决方案,帮助开发者在5分钟内实现高效的SNN应用。

weixin_29300931的博客 393

【强化学习】常用算法之一 “A3C”

A3C(Asynchronous Advantage Actor-Critic)算法是一种在强化学习领域中应用广泛的算法,它结合了策略梯度方法和价值函数的学习,用于近似解决马尔可夫决策过程(Markov Decision Process)问题。A3C算法在近年来备受关注,因为它在处理大规模连续动作空间和高维状态空间方面具有出色的性能。A3C算法是一种基于策略梯度的强化学习算法,通过多个并行的智能体异步地与环境交互,并利用Actor和Critic网络实现策略和价值的近似,从而实现快速而稳定的强化学习训练。

Code_and516的博客 6757

C++学习笔记——多态性与虚函数

多态性概念 在C ++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。 从系统实现的角度看,多态性分为两

Mr_Gintoki的博客 750

【DRAM存储器三十五】LPDDR4介绍--主要技术特性之VREF training,为什么要做VREF training?

详述DDR4、LPDDR4需要做vref training的原因和训练过程

highman110的博客 2918

C++入门学习 14 多态性与虚函数

多态:理解为:同一个函数有多个表现形式-----重用代码的一种方式 - 什么是多态性 重点 难点 静态多态性 动态多态性 -重写, - 纯虚继承与抽象类 重点 面向对象: 封装 继承 多态 抽象 什么是多态性 多态性(polymorphism)是面向对象变成的一个重要特征 如果一种语言只支持类,而不支持类,是不能称为面向对象语言的 如果一种语言只支持类概念,那么只能称为使用/基于对象的语言 多态主要是在参数里 函数名相同,但执行的具体细节不相同 //重载:函数名相同,参数列表的类型或数量不同

qq_45044146的博客 205

基于STM32设计的猪舍养殖的监控系统_325

本课题基于STM32单片机,设计一款能够实时监测猪舍环境的智能监控系统。该系统能够通过温湿度、空气质量、光照强度等传感器实时监测猪舍的环境,并能够通过自动化控制设备(如风扇、照明灯、消毒喷雾等)调节环境参数,确保养殖环境的适宜性。同时,系统还支持通过ESP8266模块实现数据上传与远程控制,使养殖管理者能够通过手机APP或计算机远程监控和控制猪舍环境。

408

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

多态性与虚函数——C/C++学习笔记

多态性(polymorphism) 即:向不同对象发送同一个消息,不同的对象在接收时候会产生不同行为。 所谓消息,就是函数调用。 C++中多态性就是:具有不同功能的函数可以有相同的函数名称。即实现用同一个函数名调用不同的函数内容。 C++多态性分为:静态多态性 和 动态多态性 静态多态性:通过函数重载或者运算符重载实现,在编译阶段即知道函数的全

TommyZht的专栏 1322

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

c++学习笔记 基类指针,虚函数,纯虚函数。多态性

class human { public: human(); ~human(); void func(); }; class man:public man { public: man(); ~man(); void func(); }; 申请内存时,可以使基类指针指向其派生类的对象。 human *h = new human;...

hongtaya的博客 317

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

c++学习虚函数,动态多态性,动态联编

#pragma once /******************************* *虚函数的实现 *虚函数:允许函数调用与函数体之间联系在运行时才建立,是现实动态联编的基础 *派生后可以在类族中实现运行时多态(动态多态性) *动态联编,程序运行后在进行联编 ********************************/ #include <iostream> using namespace std; class Point { private: int X, Y; public.

qqLML_ZR的博客 278

C++学习笔记6--多态性与虚函数

多态性与虚函数一、多态性1、概念2、典型例子二、虚函数1、作用2、静态关联与动态关联3、使用场景三、纯虚函数与抽象类1、纯虚函数2、抽象类3、实例 一、多态性 1、概念 2、典型例子 二、虚函数 1、作用 2、静态关联与动态关联 3、使用场景 三、纯虚函数与抽象类 1、纯虚函数 2、抽象类 3、实例 ...

@轨轨的博客 413

C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性

(根据《C++程序设计》(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多态性是面向对象程序设计的一个重要特征。顾名思义,多态性就是一个事物具有多种形态。在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。也就是说,每个对象可以用自己的方式去响应共同的消息,所谓消息,...

weixin_30731305的博客 591

[C++]学习笔记9:多态性与虚函数

1.多态性的概念 多态性:向不同的对象发送同一个消息,不同的对象在接受时,会产生不同的行为 支持多态:面向对象:C++、java 不支持多态:基于对象的:VB、Ada 多态的两种情况 静态多态:在程序编译时就能决定调用哪个函数 实现:函数的重载(包含运算符重载) 动态多态:在程序运行过程中才能决定调用的对象成员 实现:虚函数(virtual function) 2.虚函数 构造函数不能...

weixin_46285081的博客 296

C++程序设计学习之『多态性与虚函数』

1、多态性(polymorphism) 是面向对象程序设计的一个重要特征。 多态:向不同的对象发送同一条消息,不同的对象在接受时会产生不同的行为(即方法)。 C++中,多态性表现形式之一是:具有不同功能的函数可以用同一个函数名,这样就可以实现用同一个函数名调用不同内容的函数。 系统实现的角度: 静态多态性:通过函数重载实现,编译时的多态性,由函数重

tonypaopao的专栏 980

C++学习笔记基础篇29——多态性与虚函数

虚函数 使用基类之指针,指向派生类的对象,调用虚函数的时候,最后调用的是派生类的函数! 程序1虚函数使用举例 #include <iostream> #include <string> using namespace std; enum EStudentType { EStudentType_Error = 0, EStudentType_Xiao = 1, EStudentType_Zhong = 2, }; class CStudent { public: char *

weixin_44567900的博客 158

C++面向对象的多态性、纯虚函数、空类的大小——C++学习记录04

C++面向对象的多态性、纯虚函数、空类的大小

qq_1593724363的博客 520

C++ 多态性虚函数和动态绑定学习笔记

总之,C++中的多态通过虚函数和动态绑定来实现。虚函数允许子类对其进行重写,动态绑定根据对象的实际类型来确定调用哪个函数。使用虚函数表和虚函数指针来实现动态绑定。这种机制能够提供更灵活的代码设计和对象行为的多样性。在运行时,根据指针所指向的对象的实际类型来选择调用哪个函数,实现了多态性。它们都重写(覆盖)了基类的。指向不同的派生类对象,并调用。

m0_74824496的博客 296
上一篇: vs2013代码界面卡顿及关闭时sql compact信息报错问题解决
下一篇: linux基础知识-文件系统与磁盘分区
小帅叔叔
博客等级 码龄15年 1粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值