C++中的多态
多态性是面向对象程序设计的重要特征之一。多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。
多态的实现方式包括以下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++中的多态的更多相关文章
- 13、java中的多态
1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...
- java中实现多态的机制是什么?
多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...
- C#中区别多态、重载、重写的概念和语法结构
C#中区别多态.重载.重写的概念和语法结构 重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override. 格式: 基类中: public virtual ...
- 转载:C#中的多态
原文地址 http://www.cnblogs.com/jhxk/articles/1644018.html 感谢博主分享! 之前看到过类似的问题:如果面试时主考官要求你用一句话来描述多态,尽可能的 ...
- c++中虚多态的实现机制
c++中虚多态的实现机制 參考博客:http://blog.csdn.net/neiloid/article/details/6934135 序言 证明vptr指针存在 无继承 单继承无覆盖 单继承有 ...
- 转:C#中的多态
封装.继承.多态,面向对象的三大特性,前两项理解相对容易,但要理解多态,特别是深入的了解,对于初学者而言可能就会有一定困难了.我一直认为学习OO的最好方法就是结合实践,封装.继承在实际工作中的应用随处 ...
- python中的多态
# -*- coding: cp936 -*- #python 27 #xiaodeng #python中的多态 #多态:一个操作的意义取决于被操作对象的类型,相同的消息给予不同的对象会引发不同的动作 ...
- C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数
1昨日回顾 2 多态的练习-圆的图形 3多态的练习-程序员薪资 4员工管理案例-抽象类和技术员工的实现 employee.h: employee.cpp: technician.h: technici ...
- python中对多态的理解
目录 python中对多态的理解 一.多态 二.多态性 三.鸭子类型 python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多 ...
- Java 中的多态,一次讲个够之接口实现关系中的多态
上文还没有写完,这一篇继续 Java 中的多态,一次讲个够之继承关系中的多态 https://www.cnblogs.com/qianjinyan/p/10824576.html 接口实现关系,和继承 ...
随机推荐
- 微软免费TFS如何设置在客户端独占签出
最近发现微软给我们提供了免费的TFS,地址:http://tfs.visualstudio.com/, 就注册了一个,但是我发现没办法独占签出. 在公司里,TFS有服务端,所以很好设置,但是注册微软的 ...
- JRebel_修改class后无法正确调试问题解决【2014-03-12】
原文地址:http://www.cnblogs.com/hbbbs/p/3596179.html 现象 修改了class,编译后,JRebel自动装载到Web容器中.但此时调试这个类会发现无法正常调试 ...
- javascript 基本数据类型
1. javascript 五种基本数据类型 Undefined Boolean Number String Null,Undefined 对应的值只有一个 undefined, Boolean 对 ...
- XCODE多行代码缩进快捷键
转自:http://xiagudao.com/xcode多行代码缩进快捷键 在XCODE中无法使用TAB键对多行代码进行缩进.想多行缩进,选中需要缩进的代码使用快捷键command(花键)+] 即可右 ...
- 如何在Windows Server 2003中配置FTP站点服务
前面写过一篇文章<怎样给你的网站注册一个好域名?> ,讲到“玉米”,笔者有很深的情节,也希望与大家交流“米事”,可以站内私信我或者直接回复文章. 有了好域名只是做网站的开始.我们还要买主机 ...
- Java去除掉HTML里面所有标签的两种方法——开源jar包和自己写正则表达式
Java去除掉HTML里面所有标签,主要就两种,要么用开源的jar处理,要么就自己写正则表达式.自己写的话,可能处理不全一些自定义的标签.企业应用基本都是能找开源就找开源,实在不行才自己写…… 1,开 ...
- OC之protocol监听器的实现
画图 图解 代码 总结 一.画图 本人画了一个图(字体和画图水平请忽略) 二.图解 1.首先我们上边是一个按钮的类,按钮当中包括了一条线,这个线是什么呢? 其实难理解就难理解到这条线上了 1⃣️这条线 ...
- Java Scoket编程
Java Scoket编程 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位, ...
- PHP实现无级递归分类(ThinkPHP框架)
/** * 无级递归分类 * @param int $assortPid 要查询分类的父级id * @param mixed $tag 上下级分类之间的分隔符 * @return string $tr ...
- DNS的递归查询和迭代查询
百度运维部二面,直接懵逼的节奏 (1)递归查询 递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求, 必须使用一个准确的查询结果回复客户机. 如果DNS 服务器本地没有存 ...