C++多态性总结

一,C++多态性概述

多态是指同样的消息被不同类型的对象接受时导致不同的行为。所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就调用不同的函数。换言之,多态指的就是用同样的接口访问功能不同的函数,从而实现“一个接口,多种方法”。

二,多态性分类

在这里插入图片描述

面向对象的多态性可以分为4类:重载多态,强制多态,包含多态,参数多态。前面两种统称专用多态,后面两种统称通用多态。

三,各种多态举例说明

1,重载多态:

重载多态包括前面学过的普通函数及类的成员函数的重载还有运算符的重载。 普通函数重载举例:

1int add(int x, int y) { 2 return x + y; 3} 4double add(double x, double y) { 5 return x + y; 6} 7float add(float x, float y) { 8 return x + y; 9}

类的成员函数相当于函数在类的内部实现重载,在这儿就不详细说明了,跟普通函数重载大同小异。 下面重点介绍运算符号重载: 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同的行为。 运算符重载可以分为重载为成员函数以及重载为非成员函数两种。

重载为成员函数:

其一般语法形式为: 返回类型 operator 运算符(形参表) { 函数体 } 例1:(单目运算符)实现复数类前置++,后置++运算符重载

1#include<iostream> 2using namespace std; 3class Complex { 4public: 5 Complex(double r = 0, double i = 0) :real(r), image(i) {} 6 7 Complex& operator ++() { 8 ++this->image; 9 ++this->real; 10 return (*this); 11 12 };//前++ 13 14 Complex operator ++(int) { 15 Complex temp = *this; 16 ++(*this);//调用前置++ 17 return temp; 18 };//后++ 19 20 void diaplayComplex() const { 21 cout << "(" << this->real << "," << this->image << ")" << endl; 22 }; 23private: 24 double real; 25 double image; 26 27}; 28 29 30int main() 31{ 32 Complex c1(1, 2); 33 Complex c3(1, 2); 34 Complex c2; 35 c2=c1++; 36 c1.diaplayComplex(); 37 c2.diaplayComplex(); 38 39 c2=++c3; 40 c3.diaplayComplex(); 41 c2.diaplayComplex(); 42 return 0; 43}

运行结果: 在这里插入图片描述 这里需要注意的是前置++,返回值时Complex& 表示返回一个可修改的左值,后置++返回的是一个右值Complex ,另外,前置++形参表(),后置++形参表(int),只是对两种运算作区分。 例2:(双目运算符)重载运算符实现对复数的加法

1#include"operator.h" 2#include <iostream> 3using namespace std; 4class Complex { 5public: 6 Complex(double r = 0, double i = 0) :real(r), image(i) {} 7 Complex operator +(const Complex &c) const; 8 void diaplayComplex() const; 9private: 10 double real; 11 double image; 12 13}; 14Complex Complex::operator +(const Complex &c)const { 15 return Complex::Complex(c.real + this->real, c.image + this->image); 16}; 17void Complex::diaplayComplex() const { 18 cout << "(" << this->real << "," << this->image << ")" << endl; 19}; 20int main() 21{ 22 Complex c1(1,2); 23 Complex c2(1, 2); 24 Complex c3;//保存运算结果 25 Complex c4;//保存运算结果 26 c3 = c1.operator+(c2);//传统方法调用 27 c3.diaplayComplex(); 28 c4 = c1 + c2;//易懂的方法调用 29 c4.diaplayComplex(); 30 return 0; 31}

运行结果: 在这里插入图片描述

重载为非成员函数:

一般语法形式:

返回类型 operator 运算符(形参表) { 函数体 } 例1:对类Point重载“++”(自增),"--"(自减)运算符,要求同时重载前缀和后缀的形式,重载为非成员函数。

1//对类Point重载“++”(自增),"--"(自减)运算符,要求同时重载前缀和后缀的形式 2#include "pch.h" 3#include <iostream> 4using namespace std; 5 6class Point { 7public: 8 Point(int x=0, int y=0) :x(x), y(y) {} 9 void showPoint(); 10 //以非成员函数类型实现 11 friend Point& operator ++( Point& p); 12 friend Point operator ++(Point& p, int); 13 14private: 15 int x, y; 16}; 17void Point::showPoint() { 18 cout << "(" << x << "," <<y<< ")" << endl; 19} 20Point& operator ++( Point &p) {//前置++ 21 ++(p.x); 22 ++(p.y); 23 return p; 24}; 25Point operator ++(Point& p, int) {//后置++ 26 Point t = p; 27 ++p; 28 return t; 29}; 30 31int main() 32{ 33 Point p1, p2, p3; 34 p3 = p1++; 35 p3.showPoint(); 36 p1.showPoint(); 37 cout << "------------------------------------------" << endl; 38 p3 = ++p2; 39 p3.showPoint(); 40 p2.showPoint(); 41 return 0; 42} 43

运行结果: 在这里插入图片描述 注意,重载为非成员函数时,需要声明为友元函数,这样才能访问类的私有数据成员,从而实现相应功能。

2,强制多态

是指讲一个变元的类型加以变化,以符合一个函数或者操作的要求,举一个简单例子就清楚啦。

1int a=1; 2float b=2.4f; 3float re=a+b;

这里的加法运算符在进行浮点数和整形数相加时,首先进行类型强制转换,把整形数变为浮点数再相加的情况就是强制多态的实例。

3,包含多态

指的是类族中定义于不同类中的同名函数的多态的行为,主要是通过虚函数来实现。 那么什么是虚函数呢?

虚函数:

在类的成员函数前加virtual关键字。虚函数是实现包含多态的基础。这里需要说明的是当基类里有虚函数且派生类中重新声明了和基类虚函数相同的函数,那么派生类该函数也是虚函数,这个过程称为对基类虚函数进行重写,这对于实现包含多态有重要意义。

包含多态的条件:

基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。 通过基类对象的指针或者引用调用虚函数。 下面举个例子进行分析,看此段代码,实现了包含多态

1//编写一个哺乳动物类Mammal,再由此派生出狗类Dog,Cat类,三者都声明speak()成员函数,该函数在基类中被声明为虚函数。 2 3#include <iostream> 4#include<string > 5using namespace std; 6class Mammal { 7public: 8 virtual void speak(); 9private: 10 string name; 11}; 12class Dog :public Mammal{ 13public: 14 virtual void speak(); 15private: 16 int age; 17 18}; 19class Cat :public Mammal { 20public: 21 virtual void speak(); 22private: 23 int age; 24 25}; 26void fun(Mammal *m) {//通过传入不同对象的实参,可调用产生对应的成员函数,以实现多态的功能 27 m->speak(); 28} 29void Mammal::speak() { cout << "I don't know what to speak" << endl; }; 30void Dog::speak() { cout << "wang ~~~wang~~~ wang~~~" << endl; }; 31void Cat::speak() { cout << "miao ~~~miao~~~ miao~~~" << endl; }; 32int main() 33{ 34 Dog d; 35 Cat c; 36 //传入不同对象的参数,实现相对应的功能(多态) 37 fun(&d); 38 fun(&c); 39 40 return 0; 41} 42

运行结果: 在这里插入图片描述 这里speak()函数定义为virtual,然后通过

1void fun(Mammal *m) {//通过传入不同对象的实参,可调用产生对应的成员函数,以实现多态的功能 2 m->speak(); 3}

实现多态,注意fun()形式参数只能是基类对象指针或者引用。fun()函数也可以这样写,用基类引用实现:

1void fun(Mammal &m) {//通过传入不同对象的实参,可调用产生对应的成员函数,以实现多态的功能 2 m.speak(); 3}

纯虚函数与抽象类:

纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要给出各自的定义。纯虚函数的声明格式为: virtual 函数类型 函数名 (参数表)=0; 而抽象类就是指带有纯虚函数的类。 对上面的例子进行修改,用抽象类实现:

1//编写一个哺乳动物类Mammal,再由此派生出狗类Dog,Cat类,三者都声明speak()成员函数,该函数在基类中被声明为虚函数。 2 3#include <iostream> 4#include<string > 5using namespace std; 6class Mammal { 7public: 8 virtual void speak()=0; 9private: 10 string name; 11}; 12class Dog :public Mammal{ 13public: 14 virtual void speak(); 15private: 16 int age; 17 18}; 19class Cat :public Mammal { 20public: 21 virtual void speak(); 22private: 23 int age; 24 25}; 26void fun(Mammal &m) {//通过传入不同对象的实参,可调用产生对应的成员函数,以实现多态的功能 27 m.speak(); 28} 29void Dog::speak() { cout << "wang ~~~wang~~~ wang~~~" << endl; }; 30void Cat::speak() { cout << "miao ~~~miao~~~ miao~~~" << endl; }; 31int main() 32{ 33 Dog d; 34 Cat c; 35 //传入不同对象的参数,实现相对应的功能(多态) 36 fun(d); 37 fun(c); 38 39 return 0; 40} 41

这里需要注意的是抽象类不能进行实例化,如: 在这里插入图片描述 就会报错: 在这里插入图片描述

4,参数多态

采用函数模板,它可以用来创建一个通用的函数,以支持多种不同形参,避免重载函数的函数体重复设计,通过给出不同的类型参数,使得一个结构有多种类型。以实现参数多态。 定义的一般形式: template <模板参数表> 函数返回值类型 函数名(参数表) { 函数体
} 举例说明:下面是求绝对值得函数模板及其应用。

1#include "pch.h" 2#include <iostream> 3using namespace std; 4template <typename T> 5T abs(T x) 6{ 7 return x < 0 ? -x : x; 8} 9 10int main() { 11 int a = 1; 12 double b = -1; 13 cout << abs(a) << endl; 14 cout << abs(b) << endl; 15 return 0; 16}

运行结果: 在这里插入图片描述

四,总结

多态性可以分为4类:重载多态,强制多态,包含多态,参数多态。 对于C++的多态性,这是一项很灵活的技术,用法十分灵巧。 简单来说:多态性就是适当的使用接口函数,通过一个接口来使用多种方法,(相当于上级说一个命令,甲乙丙丁等人都做出反应,一个命令,产生多个反应。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

C++虚函数详解:多态性实现原理及其在面向对象编程中的应用

在面向对象的编程中,多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时,可以产生不同的行为。C是一种面向对象的编程语言,在C中,虚函数是实现多态性的关键什么是虚函数虚函数是一个在基类中声明的函数,它可以被子类重写并提供不同的实现

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

\TOC\多态性Part1多态性概述多态是指同样的消息被不同类型的对象接收时导致不同的行为。在C中,所谓信息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。1)多态的类型分为四类:重载多态,强制多态,包含多态和参数多态。前两者为专用多态,而后者称为通用多态。2)

C++多态性总结 - HelloWorld