多态性是面向对象程序设计的重要特征之一。多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。

多态的实现方式包括以下3种:函数重载、运算符重载、虚函数。

1、运算符重载:

 #include<iostream>
using namespace std; class Complex
{
private:
int real,imag;
public:
void show() const;
Complex operator +(const Complex c);
Complex operator -(const Complex c);
/*
Complex(int a=0,int b=0)
{
real=a;imag=b;
}
*/
Complex(int a=,int b=):real(a),imag(b)
{}
};//don't forget this! void Complex::show() const
{
cout<<"real:"<<real<<"imag:"<<imag<<endl;
} Complex Complex::operator +(const Complex c)
{
Complex ret;
ret.real=real+c.real;
ret.imag=imag+c.imag;
return ret;
} Complex Complex::operator -(const Complex c)
{
Complex ret;
ret.real=real-c.real;
ret.imag=imag-c.imag;
return ret;
} int main()
{
Complex a(,),b(-,),c,d;
a.show();
b.show();
c=a+b;
d=a-b;
c.show();
d.show();
return ;
}

注意运算符重载操作数个数:重载为类的成员函数时,参数个数=原操作数个数-1(后置++、--除外);重载为非成员函数时,参数个数=原操作数个数,且至少有一个自定义类型。

 #include<iostream>
using namespace std; class Clock
{
private:
int hour,minute,second;
public:
Clock(int a=,int b=,int c=):hour(a),minute(b),second(c)
{
//hour=a;minute=b;second=c;
}
void show() const;
Clock operator ++();
Clock operator ++(int);
}; void Clock::show() const
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
} //before
Clock Clock::operator ++()
{
if(second+>=)
{
second=second-;
if(minute+>=)
{
minute=;
if(hour+>=)
hour=;
else hour=hour+;
}
else minute=minute+;
}
else second=second+;
return *this;
} //behind still one argument
Clock Clock::operator ++(int)
{
Clock ret=*this;
++(*this);
return ret;
} int main()
{
Clock clock(,,);
cout<<"The time is:";
clock.show(); cout<<"(Time++) is:";
(clock++).show(); cout<<"(++Time) is:";
(++clock).show();
return ;
}

前置++重载,0个操作数;后置++重载,1个操作数,函数中不需要使用该操作数。

2、虚函数:

注意事项:若需要使用多态,则继承方式必须是public或者protected继承,且需要使用到的虚函数在基类中必须是public类型。

 #include<iostream>
using namespace std; class Base1
{
public:
virtual void show()
{
cout<<"I am base1!"<<endl;
}
}; class Base2
{
public:
void show()
{
cout<<"I am base2!"<<endl;
}
}; class Derived1:public Base1
{
void show()
{
cout<<"I am Derived1!"<<endl;
}
}; class Derived2:public Base2
{
void show()
{
cout<<"I am Derived2!"<<endl;
}
}; class Derived3:public Base1,public Base2
{
void show()
{
cout<<"I am Derived3!"<<endl;
}
}; int main()
{
Base1 *p1;
Base2 *p2;
Derived1 d1;
Derived2 d2;
Derived3 d3; p1=&d1;
p1->show(); p2=&d2;
p2->show(); p1=&d3;
p1->show();
p2=&d3;
p2->show(); return ;
}

纯虚函数:virtual void func()=0;

抽象类:包含了纯虚函数的类。

C++中的多态的更多相关文章

  1. 13、java中的多态

    1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...

  2. java中实现多态的机制是什么?

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

  3. C#中区别多态、重载、重写的概念和语法结构

    C#中区别多态.重载.重写的概念和语法结构 重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override. 格式: 基类中: public virtual ...

  4. 转载:C#中的多态

    原文地址 http://www.cnblogs.com/jhxk/articles/1644018.html  感谢博主分享! 之前看到过类似的问题:如果面试时主考官要求你用一句话来描述多态,尽可能的 ...

  5. c++中虚多态的实现机制

    c++中虚多态的实现机制 參考博客:http://blog.csdn.net/neiloid/article/details/6934135 序言 证明vptr指针存在 无继承 单继承无覆盖 单继承有 ...

  6. 转:C#中的多态

    封装.继承.多态,面向对象的三大特性,前两项理解相对容易,但要理解多态,特别是深入的了解,对于初学者而言可能就会有一定困难了.我一直认为学习OO的最好方法就是结合实践,封装.继承在实际工作中的应用随处 ...

  7. python中的多态

    # -*- coding: cp936 -*- #python 27 #xiaodeng #python中的多态 #多态:一个操作的意义取决于被操作对象的类型,相同的消息给予不同的对象会引发不同的动作 ...

  8. C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数

    1昨日回顾 2 多态的练习-圆的图形 3多态的练习-程序员薪资 4员工管理案例-抽象类和技术员工的实现 employee.h: employee.cpp: technician.h: technici ...

  9. python中对多态的理解

    目录 python中对多态的理解 一.多态 二.多态性 三.鸭子类型 python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多 ...

  10. Java 中的多态,一次讲个够之接口实现关系中的多态

    上文还没有写完,这一篇继续 Java 中的多态,一次讲个够之继承关系中的多态 https://www.cnblogs.com/qianjinyan/p/10824576.html 接口实现关系,和继承 ...

随机推荐

  1. 位图字体生成工具Bitmap Font Generator的使用

    首先,说下为什么要使用这款工具作为cocos2d-x的字体生成工具.其实cocos2d-x能使用的字体生成工具也有好几个,当然了本人也没有全部使用过,就不一一说明了.Bitmap Font Gener ...

  2. 0c-39-ARC下单对象内存管理

    1.ARC工作原理详述 ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease A ...

  3. 云服务器 ECS Linux 系统添加“回收站”

    删除是危险系数很高的操作,一旦误删可能会造成难以估计的损失.在云服务器 ECS Linux 系统中这种危险尤为明显.比如,一条简单的语句:rm –rf /* 就会把整个系统全部删除,而 Linux 并 ...

  4. 云服务器 ECS Linux 修改编码格式

    https://help.aliyun.com/knowledge_detail/41424.html?spm=5176.7841174.2.19.Le8kvy 通常情况下,云服务器 ECS Linu ...

  5. BinaryWriter和BinaryReader用法

      C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操作,于是StreamWriter和 StreamReader类增强了FileStream,它让我们在字符串级 ...

  6. Google 推出全新的两步验证机制

    近日 Google 在官方的 Apps Updates 博客公布了全新的两步验证功能--Google 提示,新的功能通过与 Google App 联动,进一步将验证确认工作缩减到仅有两步,同时支持 A ...

  7. MySQL无视密码进入Server

    在[mysqld]的段中加上一句:skip-grant-tables 如下 [mysqld] skip-grant-tables 即可不输入密码就可以进入mysql server,然后就可以随便修改数 ...

  8. js的Touch事件

    js的touch事件,一般用于移动端的触屏滑动$(function(){document.addEventListener("touchmove", _touch, false); ...

  9. Flume-ng-1.4.0 spooling source的方式增加了对目录的递归检测的支持

    因为flume的spooldir不支持子目录文件的递归检测,并且业务需要,所以修改了源码,重新编译 代码修改参考自:http://blog.csdn.net/yangbutao/article/det ...

  10. iOS 生成随机数 重复 不重复

    //编程的时候,有三条任选执行路径,都会显示一些图片,比如路径1显示的图片是一个人,路径2显示的是两个人,路径3显示任意人数的图片,要求每次进入该页面都不能重复初始的那张图片. 于是我想到了 运用随机 ...