多态

c++第五次博客作业

本小妞迷上赌 提交于 2019-12-02 11:04:53
       C++虚函数,纯虚函数,抽象类以及虚基类的区别   Part1.C++中的虚函数 什么是虚函数: 直观表达就是,如果一个函数的声明中有 virtual 关键字,那么这个函数就是虚函数。 虚函数的作用: 虚函数的最大作用就是实现面向对象程序设计的一大特点,多态性,多态性表达的是一种动态的概念,是在函数调用期间,进行动态绑定,以达到什么样的对象就实现什么样的功能的效果。 虚函数的一般声明语法: virtual 函数类型 函数名 (形参表) 注意: 虚函数的声明只能出现在类的定义中,不能出现在成员函数实现的时候 虚函数一般不声明为内联函数,但是声明为内联函数也不会引起错误 在运行过程中要实现多态的三个条件: 类之间满足赋值兼容关系(也就是类之间有继承关系) 要声明为虚函数 调用虚函数时,要由成员函数或者是指针和引用来访问 代码举例 #include <iostream> using namespace std; class Base1 { public: public: virtual void play(); }; void Base1::play() { cout << "Base1::play()" << endl; } class Base2: public Base1 { virtual void play(); }; void Base2::play() {

多态性

泪湿孤枕 提交于 2019-12-02 10:59:24
多态性 多态性概述 多态是指同样的消息被不同类型的对象接收时导致不同的行为。 消息:对类的成员函数的调用 行为:实现,也就是调用了不同的函数 例如:使用同样的加号"+",就可以实现整型数之间、浮点数之间、双精度浮点数之间的加法,以及这几种数据类型混合的加法运算。 同样的消息:相加 被不同类型的对象:变量 不同的行为:不同类型的变量采用不同的方式进行加法的运算 多态的类型 分为4类:重载多态、强制多态、包含多态和参数多态 多态的实现 在编译的过程中确定了同名操作的具体操作对象的多态叫做 静态多态或编译时的多态 在编译的过程中无法确定,而在程序运行的过程中才能动态地确定操作所针对的具体对象的多态叫做 动态多态或运行时的多态 运算符重载 该部分用来介绍如何通过运算符重载来扩充运算符的作用 运算符的重载形式有两种,即重载为类的非静态成员函数和重载为非成员函数。运算符重载为类的成员函数的 一般语法形式为: 返回类型 operator运算符(形参表) { 函数体 } 运算符重载为非成员函数的一般语法形式为同上 以实现自定义数据类型复数的相加减为例 #include<iostream> using namespace std; class Complex { //复数类定义 public: //外部接口 Complex(double r=0.0,double i=0.0):real(r)

重载与多态

孤街浪徒 提交于 2019-12-02 10:57:40
一、概念 重载:函数名相同,但是函数参数不同。调用时根据参数的不同决定调用哪一个函数 多态:函数名相同,函数形参也相同。调用时根据函数类型是虚函数还是普通成员函数决定调用哪一个 重写:若子类和父类的某个函数具有相同的函数名,相同的形参列表,且父类中的函数被定义为虚函数,则子类对该函数的实现被称为函数的重写 二、重载 1.函数重载 2.运算符重载 其语法形式为: 返回类型 operator 运算符(形参表) { 函数体 } 仿照该语法形式重载“++”运算符 1 Point operator +(const Point& A ,const Point& B) { 2 return Point(A.x + B.x, A.y + B.y); 3 } 该重载运算符的作用是让A,B中的x,y相加,放入程序中运行: 来源: https://www.cnblogs.com/jianW1024/p/11742344.html

C++ 虚函数

ⅰ亾dé卋堺 提交于 2019-12-02 10:56:31
虚函数 在了解虚函数之前,我们先来考虑一个问题。我们创建一个基类,在它的派生类中声明一个与基类函数同名的函数,声明之后,我们要实现的是通过基类的指针实现对派生类函数的访问。有些人会说,直接将派生类的地址赋值给基类的指针就OK了呀。这样能实现吗?我们通过代码来实验。 #include "pch.h" #include <iostream> using namespace std; class Base1 { public: void display() { cout << "Base1::display()" << endl; } private: }; class Base2:public Base1 { public: void display() { cout << "Base2::display()" << endl; } private: }; class Base3:public Base2 { public: void display() { cout << "Base3::display()" << endl; } private: }; void fun(Base1 *a) { a->display(); } int main() { Base2 b; Base3 c; fun(&b); fun(&c); } 通过将Base2 、Base3的地址传给Base1的指针

重载和多态

江枫思渺然 提交于 2019-12-02 09:51:37
重载与多态 重载与多态与重写的区别: 重载 : 函数名相同,但是函数的参数不同,调用时根据参数的不同决定调用哪一个函数。 多态 : 函数名相同,函数形参相同。调用时根据函数类型时虚函数还是普通函数决定调用哪一个。 重写 : 若子类和父类的某个函数具有相同的函数名,相同的形参列表,且父类中的函数被定义为虚函数,则子类对该函数的实现被称为函数的重写。 caution! 若函数不声明为虚函数,只能通过类名限定名的方式访问父类或者子类的方法。这叫做隐藏。 若函数声明为虚函数,则可以通过指针访问每一个方法,这叫做覆盖。 接下来,让我们分别对以上的概念进行实现: 一.重载 1.函数重载 在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。 如下例子: #include <iostream> using namespace std; class printData { public: void print(int i) { cout << "整数为: " << i << endl; } void print(double f) { cout << "浮点数为: " << f << endl; } void print(char c[]) { cout << "字符串为: " << c <<

多态---相关操作

為{幸葍}努か 提交于 2019-12-02 09:20:00
多态—相关操作 基本格式与使用 Zi类 package cn . xiaoge . day10 . demo04 ; public class Zi extends Fu { @Override public void method ( ) { System . out . println ( "子类方法" ) ; } } Fu类 package cn . xiaoge . day10 . demo04 ; public class Fu { public void method ( ) { System . out . println ( "父类方法" ) ; } public void methodFu ( ) { System . out . println ( "父类特有方法" ) ; } } 执行路口 package cn . xiaoge . day10 . demo04 ; /* 代码当中体现多态性, 其实就是一句话: 父类引用指向子类对象. 格式: 父类名称 对象名 = new 子类名称(); 或者: 接口名称 对象名 = new 实现类名称(); */ public class Demo01Multi { public static void main ( String [ ] args ) { // 使用多态的写法 // 左侧父类的引用, 指向了右侧子类的对象

C++中多态实现的关键——虚函数

删除回忆录丶 提交于 2019-12-02 09:13:37
1.多态的作用 在面向对象程序设计中,使用多态能够增强代码的可扩充性,,即程序需要增加或修改部分功能时,只需修改少量代码就能够达到目的,此外多态也能起到精简代码的作用。 而实现多态的关键点,就是虚函数如何使用。 虚函数 1.虚函数的使用方法 .基同类与派生类同时拥有的同名同参数表的函数,在设计时,最好将其声明为虚函数,只需在函数前面加上关键字virtual即可 下面通过一个具体的例子来说明 #include<iostream> using namespace std; class Shape{ public: void Printf(){ cout<<" The Shape has been called"<<endl; } }; class Rectangle:public Shape{ public: void Printf(){ cout<<"The Rectangle has been called"<<endl; } }; class Circle:public Shape{ public: void Printf(){ cout<<"he Circle has been called"<<endl; } }; void Print(Shape &a) { a.Printf(); } void Print(Rectangle &a) { a.Printf(); }

C++课程第五次博客——多态

守給你的承諾、 提交于 2019-12-02 08:16:31
目录 多态性 Part1 多态性概述 Part2 多态实验 Part3 总结 多态性 Part1 多态性概述 多态是指同样的消息被不同类型的对象接收时导致不同的行为。在C++中,所谓信息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。 1)多态的类型 分为四类:重载多态,强制多态,包含多态和参数多态。前两者为专用多态,而后者称为通用多态。 2)多态的实现 分为两类:编译时的多态和运行时的多态。 前者是在 编译的过程中 确定了同名操作的具体操作对象 后者则是在 程序运行过程中 才多态确定操作所针对的具体对象 这种确定操作的具体对象的过程就是绑定,绑定是指计算机程序自身彼此关联的过程,也就是把一条信息和一个对象相结合的过程。绑定工作在编译连接阶段完成的情况称为 静态绑定 ,例如重载,强制和参数多态。而绑定工作在程序运行阶段完成的情况称为 动态绑定 ,例如多态操作对象的确定通过动态绑定完成。 Part2 多态实验 在多态性中,运算符重载、虚函数、纯虚函数和抽象类是相对来说难以理解的,下面我们主要将对这些知识点,设计实验并探索。 运算符重载 第一注意点 当运算符重载为类的成员函数时,函数的参数个数比原来的操作数个数要少一个(后置“++”,“--”除外) #include <iostream> using namespace std; class fun{

条款07:为多态基类声明virtual析构函数

試著忘記壹切 提交于 2019-12-02 08:06:07
Declare destructors virtual in polymorphic base classes. 有许多种做法可以记录时间,因此,设计一个TimeKeeper base class和一些derived classes作为不同的计时方法,相当合情合理: class TimeKeeper { public: TimeKeeper(); ~TimeKeeper(); }; class AtomicClock:public TimeKeeper {...};//原子钟 class WaterClock:public TimeKeeper {...};//水钟 class WristWatch:public TimeKeeper {...} //腕表 许多客户只想在程序中使用时间,不想操心时间如何计算等细节,这时候我们可以设计factory(工厂)函数,返回指针指向一个计时对象。Factory函数会“返回一个base class指针,指向新生成的derived class对象”:TimeKeeper *getTimeKeeper(); 为遵守factory函数的规范,被getTimeKeeper()返回的对象必须位于heap。因此为了避免泄露内存和其他资源,将factory函数返回的每一个对象适当的delete掉很重要: TimeKeeper* ptk =

多态(经典案例)

痴心易碎 提交于 2019-12-02 07:04:54
案例:打印 矩形 和 圆形 矩形: x(横坐标), y(纵坐标),length(长度), wid(宽度) 圆形: x(横坐标), y(纵坐标), r(半径) 思路: 矩形 和 圆形 都有 共同的元素:x(横坐标), y(纵坐标) 那么可以把x, y抽取出来 定义出一个 形状类作为父类,形状类中 包含这两个属性。 定义一个 矩形类,继承 形状类。在自己类中扩展 length(长度), wid(宽度)属性 定义一个 圆形类,继承 形状类。在自己类中扩展 r(半径) 属性 写一个测试类,定义相应的方法 来实现功能。 代码实现: 1.定义一个形状类: public class Shape { // 形状类 private int x; // 描述横坐标 private int y; // 描述纵坐标 public Shape() { super(); } public Shape(int x, int y) { super(); // this.x = x; // this.y = y; setX(x); // 推荐这种写法,可以对x,y值做判断。只需在对应方法中,设置判断条件即可 setY(y); } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() {