多态参考代码分析

合集下载

.NET4.0 认识多态

.NET4.0  认识多态

4.0 认识多态类的多态性是指多种形式或多种形态。

在面向对象编程中,多态是指同一个消息或操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

Colour( )方法时,表现出了不同的行为,如图3-7所示。

图3-7 显示继承的结果多态的实现看起来很简单,但是要完全理解及灵活的运用多态机制,也不是一件容易的事。

1.New关键字在多态中的用法先通过下列例子,来了解一下new关键字的应用,并通过实例来分析多态性。

在上述代码中,当派生类bus 的Colour( )方法使用new 修饰时,bus 类实例化后转换为vehicle 对象。

而调用bus 对象的方法时,则调用是vehicle 类中的Colour ( )方法,其显示结果如图3-8所示。

图3-8 显示结果使用new 关键字后,使得bus 中的Colour( )方法和vehicle 类中的Colour( )方法成为两个独立的方法,而只是名字相同而已。

因此,无论vehicle 类中的Colour( )方法是否使用virtual 修饰,也不管访问权限如何,都不会对bus 类中的Colour( )方法产生任何影响。

2.override 实现多态一般使用override 来实现多态,如在上述的代码vehicle 基类中,在Colour( )方法使用virtual 修饰符标记为虚拟方法。

再在派生类bust 和saloon_car 中,用override 修饰符来对Colour( )方法进行修饰。

这样实例了方法重写,并且很简单就实现了多态性。

在多层继承中,如vehicle 基类,有一个virtual 修饰的Colour( )方法。

而saloon_car 类继承自类vehicle 基类,并使用override 修饰Colour( )方法,进行重写。

严格的说,用户不能通过new 关键字来实现多态性效果,只能说在某些特定的时候,碰巧实现了多态的效果。

要对一个类中一个方法用override 修饰,该类必须从父类中继承了一个对应的用virtual 修饰的虚拟方法,否则编译器将报错。

第七章 面向对象的Java实现-继承和多态

第七章 面向对象的Java实现-继承和多态

Java教员
.NET教员
10
为什么需要继承 4-4
public class JavaTeacher2 extends Teacher { public JavaTeacher2(String myName, String mySchool) { super(myName, mySchool); 子类自动继承父类的属 } 性和方法,子类中不再 public void giveLesson(){ 存在重复代码 System.out.println("启动 Eclipse"); super.giveLesson(); } } public class DotNetTeacher2 extends Teacher { public DotNetTeacher2(String myName, String mySchool) { super(myName, mySchool); } public void giveLesson(){ System.out.println("启动 Visual Studio .NET"); super.giveLesson(); } } 使用继承,可以有效实现代码复用
4
本章目标
掌握继承 掌握super关键字 掌握多态
5
生活中的继承 2-1
生活中,继承的例子随处可见
动物 谁是父类? 谁是子类? 能说出继承的特点吗?
食草动物
食肉动物
继承需要符合的关系:is-a,父类更通用、子类更具体
6
生活中的继承 2-2
子类具有父类的一般特性(包括属性和行为), 以及自身特殊的特性
可以接收子类类型 public class HQ3 { public void judge(Teacher t){ t.introduction(); t.giveLesson(); 根据实际创建的对象 } 类型调用相应方法 大家好!我是北京中心的李明. 启动 Eclipse 知识点讲解 总结提问

java多态练习题

java多态练习题

java多态练习题Java多态练习题Java是一种面向对象的编程语言,其中的多态性是其最重要的特性之一。

通过多态,我们可以实现代码的灵活性和可扩展性。

在这篇文章中,我们将通过一些练习题来加深对Java多态性的理解。

练习一:动物的多态假设有一个动物类Animal,它有一个方法叫做makeSound(),用于输出动物的叫声。

现在我们派生出了两个子类Dog和Cat,它们分别重写了makeSound()方法,分别输出"汪汪汪"和"喵喵喵"。

现在我们创建一个Animal类型的数组,数组中存放了不同的动物对象,包括Dog和Cat。

我们遍历数组,调用每个动物对象的makeSound()方法,观察输出结果。

代码示例:```javaclass Animal {public void makeSound() {System.out.println("动物发出叫声");}}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("汪汪汪");}}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("喵喵喵");}}public class PolymorphismExample {public static void main(String[] args) { Animal[] animals = new Animal[3]; animals[0] = new Dog();animals[1] = new Cat();animals[2] = new Dog();for (Animal animal : animals) {animal.makeSound();}}}```运行结果:```汪汪汪喵喵喵汪汪汪```通过这个练习题,我们可以看到多态的作用。

多态的概念和作用(深入理解)

多态的概念和作用(深入理解)

多态的概念和作⽤(深⼊理解)多态是⾯向对象的重要特性,简单点说:“⼀个接⼝,多种实现”,就是同⼀种事物表现出的多种形态。

编程其实就是⼀个将具体世界进⾏抽象化的过程,多态就是抽象化的⼀种体现,把⼀系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进⾏对话。

对不同类的对象发出相同的消息将会有不同的⾏为。

⽐如,你的⽼板让所有员⼯在九点钟开始⼯作, 他只要在九点钟的时候说:“开始⼯作”即可,⽽不需要对销售⼈员说:“开始销售⼯作”,对技术⼈员说:“开始技术⼯作”, 因为“员⼯”是⼀个抽象的事物, 只要是员⼯就可以开始⼯作,他知道这⼀点就⾏了。

⾄于每个员⼯,当然会各司其职,做各⾃的⼯作。

多态允许将⼦类的对象当作⽗类的对象使⽤,某⽗类型的引⽤指向其⼦类型的对象,调⽤的⽅法是该⼦类型的⽅法。

这⾥引⽤和调⽤⽅法的代码编译前就已经决定了,⽽引⽤所指向的对象可以在运⾏期间动态绑定。

再举个⽐较形象的例⼦:⽐如有⼀个函数是叫某个⼈来吃饭,函数要求传递的参数是⼈的对象,可是来了⼀个美国⼈,你看到的可能是⽤⼑和叉⼦在吃饭,⽽来了⼀个中国⼈你看到的可能是⽤筷⼦在吃饭,这就体现出了同样是⼀个⽅法,可以却产⽣了不同的形态,这就是多态!多态的作⽤:1. 应⽤程序不必为每⼀个派⽣类编写功能调⽤,只需要对抽象基类进⾏处理即可。

⼤⼤提⾼程序的可复⽤性。

//继承2. 派⽣类的功能可以被基类的⽅法或引⽤变量所调⽤,这叫向后兼容,可以提⾼可扩充性和可维护性。

//多态的真正作⽤,以前需要⽤switch实现----------------------------------------------------多态是⾯向对象程序设计和⾯向过程程序设计的主要区别之⼀,何谓多态?记得在CSDN⾥⼀篇论C++多态的⽂章⾥有⼀名话:“龙⽣九⼦,⼦⼦不同”多态就是同⼀个处理⼿段可以⽤来处理多种不同的情况,在钱能⽼师的《C++程序设计教程》书中有这样⼀个例⼦:定义了⼀个⼩学⽣类[本⽂全部代码均⽤伪码]class Student{public:Student(){}~Student(){}void 交学费(){}//......};⾥⾯有⼀个 “交学费”的处理函数,因为⼤学⽣和⼩学⽣⼀些情况类似,我们从⼩学⽣类中派⽣出⼤学⽣类:class AcadStudent:public Student{public:AcadStudent(){}~ AcadStudent(){}void 交学费(){}//.......};我们知道,中学⽣交费和⼤学⽣交费情况是不同的,所以虽然我们在⼤学⽣中继承了中学⽣的"交学费"操作,但我们不⽤,把它重载,定义⼤学⽣⾃⼰的交学费操作,这样当我们定义了⼀个⼩学⽣,⼀个⼤学⽣后:Student A;AcadStudent B;A.交学费(); 即调⽤⼩学⽣的,B.交学费();是调⽤⼤学⽣的,功能是实现了,但是你要意识到,可能情况不仅这两种,可能N种如:⼩学⽣、初中⽣、⾼中⽣、研究⽣.....它们都可以以Student[⼩学⽣类]为基类。

[转]boost::any的用法、优点和缺点以及源代码分析

[转]boost::any的用法、优点和缺点以及源代码分析

[转]boost::any的⽤法、优点和缺点以及源代码分析boost::any⽤法⽰例:#include <iostream>#include <list>#include <boost/any.hpp>typedef std::list<boost::any> list_any;//关键部分:可以存放任意类型的对象void fill_list(list_any& la){la.push_back(10);//存放常数la.push_back( std::string("dyunze") );//存放字符串对象;注意la.push_back(“dyunze”)错误,因为会被当错字符串数组}//根据类型进⾏显⽰void show_list(list_any& la){list_any::iterator it;boost::any anyone;for( it = la.begin(); it != la.end(); it++ ){anyone = *it;if( anyone.type() == typeid(int) )std::cout<<boost::any_cast<int>(*it)<<std::endl;else if( anyone.type() == typeid(std::string) )std::cout<<boost::any_cast<std::string>(*it).c_str()<<std::endl;}}int main(){list_any la;fill_list(la);show_list(la);return0;}boost::any的优点:对设计模式理解的朋友都会知道合成模式。

因为多态只有在使⽤指针或引⽤的情况下才能显现,所以std容器中只能存放指针或引⽤(但实际上只能存放指针,⽆法存放引⽤,这个好像是c++的不⾜吧)。

《Python编程案例教程》(高登) 6

《Python编程案例教程》(高登) 6

任务一
面向对象程序设计(object oriented programming,OOP)是将所有预处理的问题抽象 为对象,并将相应的属性和行为封装起来,以提高软件的重用性、灵活性和扩展性。
现实世界中,对象就是客观存在的某一事物,如一个人、一辆自行车等。而面向对象的编程世 界中,对象具有属性和行为两个特征,每个对象都有各自的属性和行为。而类是对这些具有共同特 征的对象的概括、归纳和抽象表达。例如,将人抽象为“人”类,它具有名字、性别等属性,行走、 吃饭等行为,那么具体的名字为“小明”“小红”的个体就是“人”类的对象,具体关系如图6-1 所示。
项目六 面向对象编程
项目六
项目导读
Python是真正面向对象的高级动态编程语言,它以类和对象作为面向对象编程的基础, 具有封装、继承和多态三大基本特性,能够很好地支持代码复用和设计复用,使得代码具有更 好的可读性和可扩展性。本项目将详细介绍Python中面向对象编程的方法。
项目六
学习目标
✓ 理解面向对象程序设计思想。 ✓ 掌握定义类和创建对象的方法,self参数、构造方法和析构方法的使用
项目六
Content
任务一
开发“动物园里有什么”游戏
任务一
开发“动物园里有什么”游戏

任务描述
“动物园里有什么”游戏想要实现的功能是轮流说出一种动物的种类及叫声,如果该动物在 预先规定的范围中,则输出动物的种类及叫声,否则终止游戏。本任务将带领大家利用类和对 象,开发“动物园里有什么”游戏。
知识链接
person = Person() person.speak() print('我是{}'.format())
#定义Person类 #定义姓名变量 #定义说方法

类的继承与多态性实验报告

类的继承与多态性实验报告

类的继承与多态性实验报告目录1.介绍2.什么是多态3.多态在Java中的技术基础4.示例5.多态的好处6.总结介绍之前的文章介绍过类的封装性和继承性,现在是时候聊聊面向对象编程的三大特性之一的最后一个类的多态性了。

多态的基础是继承(包括了接口的实现)和方法的覆盖。

什么是多态多态对应的英文单词是polymorphism,百度翻译给出的翻译是:n.多型现象,多态性; 多机组合形式;按字面意思就是多种状态、形态、姿态等等,潜台词就是某个东西具有多种状态、形态、姿态等等。

那是什么东西呢?在面向对象的编程语言里面(当然就包括Java了)就是某个方法或函数。

那方法的多种状态、形态、姿态有是个什么意思呢?这其实是指同一个方法具有多个方法体,就是方法的实现。

而方法的相同与否是由方法签名决定的。

所以,多态其实本质上是指同一个类的同一个方法却具有不同的行为特征。

状态、形态、姿态指的就是行为特征。

多态在Java中的技术基础然而,在Java中,同一个类里面是不可能存在两个签名相同而实现不同的方法的,否则的话会导致无法判断该执行哪个方法,因此在编译时就会报错。

所以,肯定是在两个类中才有可能存在两个签名相同而实现不同的方法,一个实现在这个类,另一个实现在另一个类。

而如果这两个类毫无瓜葛,那么肯定就与多态的本质(同一个类的同一个方法却具有不同的行为特征)自相矛盾了。

所以,这两个类肯定是有某种联系的。

我们再想想,什么概念是能够让两个不同的类却又能称为同一个类的?答案就是类的继承/扩展,就是现实中的“某东西是某类东西”的概念,就是“具体和抽象”的思想。

比如,男人是人,女人也是人,男人类和女人类就借助于人类建立了某种联系,而人类具有的某个行为在男人类和女人类中是有着不同体现的,比如人类的吃饭这个行为,男人类的体现是狼吞虎咽,女人类的体现是细嚼慢咽。

例子不是很恰当,但意思就是这么个意思。

所以说,Java里面多态的技术基础就是方法的覆盖,当然,在Java中覆盖不仅仅发生在类的继承/扩展上,还可能发生在接口的实现上。

R语言编程对SNP的分析

R语言编程对SNP的分析
library read.table("D:/snp.csv",header=T) read.table("D:/3.txt",header=FALSE) library(LDheatmap) MyHeat map <- L Dheat map (CEUSN P, CEU Dist ,
科技创新导报 2018 NO.21 Science and Technology Innovation Herald
DOI:10.16660/ki.1674-098X.2018.21.146
R语言编程对SNP的分析
信息科学
于 黑龙江哈尔滨 150030)
1 SNP的研究方法 在 二倍 体 生物中,一 般 情况下 某 个 位 点的 S N P 通常只
有转换和颠换两种形式。如何分析SNP,例如要分析人类 TCF4基因的SNP,我们在EMBL数据库[3]中搜集到了当前 人类TCF4基因最全面的SNP信息,在图中的第二行,不同 颜色的竖线代表不同类型的SNP。其中绿色是同义突变类 型,黄色是错义突变类型,蓝色是内含子突变类型。
生物在 进化 过程中会产生许多变异,基因组上 某一 位 点 发 生两 个以 上的 变 异且 能 够 遗 传至 后代 时,这 种 变 异 通常 称 为 遗 传 多 态 性。遗 传 多 态 性 分 为三 种:限 制 性 片段长 度多 态 性、简单序 列长 度多 态 性 和 单 核氨 酸 多 态 性。其中单 核 苷 酸 多 态 性 是目前研 究 较 为火 热的生物 学问题。单核苷酸多态性英文全称为Single Nucleotide Ploy m or p h ism s,缩 写为 S N P。这种多 态 性 是 指基因组中单 个核苷酸的点突变。
摘 要:单核苷酸多态性(SNP)是生物遗传多态性的一种类型,在各种生物中普遍存在。由于单核苷酸变异可以发生在基因
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1224: 多态-虚函数问题Description请以点类Point为基类派生出一个圆类Circle。

Point类的数据成员为x、y(私有属性,存储点的横纵坐标),成员函数有构造函数Point(实现对数据成员x、y的初始化)、输出函数Display(输出点坐标);圆类Circle的数据成员为r(私有属性,存储圆的半径,圆心的点坐标通过继承点类Point加以实现),成员函数有构造函数Circle、计算圆的面积函数Area、计算圆的周长函数Perimeter和输出函数Display,其中构造函数实现基类和圆类的数据成员的初始化,Display函数实现圆心坐标、圆的半径、圆的面积(利用Area函数实现)和圆的周长(利用Perimeter函数实现)的输出。

实现Point类和Circle类的定义及成员函数。

主函数的代码(不允许改动)如下:int main(){double x,y,r;cin>>x>>y>>r; //圆心的点坐标及圆的半径Point *p;p=new Point(x,y);p->Display();p=new Circle(x,y,r);p->Display();return 0;}说明:圆周率PI的取值为3.14提示:Display应设计为虚函数InputOutputSample Input0 0 1Sample OutputPoint(0,0)Circle's center:Point(0,0)Radius:1Area:3.14Perimeter:6.28****************************************************************#include <iostream>using namespace std;const double PI=3.14;class Point{private:double x,y;public:Point(double x1,double y1);virtual void Display(); //虚函数};Point::Point(double x1,double y1){ x=x1;y=y1;}void Point::Display(){ cout<<"Point("<<x<<","<<y<<")"<<endl;}class Circle:public Point{private:double r;public:Circle(double x1,double y1,double r1);void Display();double Area();double Perimeter();};double Circle::Area(){ return PI*r*r;}double Circle::Perimeter(){ return 2*PI*r;}Circle::Circle(double x1,double y1,double r1):Point(x1,y1) { r=r1; }void Circle::Display(){cout<<"Circle's center:";Point::Display(); //excute Point::Display of base class cout<<"Radius:"<<r<<endl;cout<<"Area:"<<Area()<<endl;cout<<"Perimeter:"<<Perimeter()<<endl;}int main(){double x,y,r;cin>>x>>y>>r; //圆心的点坐标及圆的半径Point *p;p=new Point(x,y);p->Display();p=new Circle(x,y,r);p->Display();return 0;}1229: 多态-抽象类1Description定义一个抽象类Shape,应用抽象类Shape派生圆类circle、圆的内接正方形类In_Square和圆的外切正方形类Ex_Square。

main中利用指向抽象类的指针实现求圆、圆的内接正方形和圆的外切正方形的面积和周长。

请实现各个类的成员函数,已知各类的定义及main中的代码如下(不允许修改):class Shape{public:Shape();virtual double Area()=0;virtual double Perimeter() = 0;};class Circle:public Shape{public:Circle(double rr);double Radius();double Area();double Perimeter();private:double r; //圆的半径};class In_Square:public Circle{public:In_Square(double rr);double Area();double Perimeter();};class Ex_Square:public Circle{public:Ex_Square(double x);double Area();double Perimeter();};int main(){Shape *ptr;double r;cin>>r;ptr=new Circle(r);cout<<"Circle's area:"<<ptr->Area()<<endl;cout<<"Circle's perimeter:"<<ptr->Perimeter()<<endl;ptr=new In_Square(r);cout<<"In_Square's area:"<<ptr->Area()<<endl;cout<<"In_Square's perimeter:"<<ptr->Perimeter()<<endl;ptr=new Ex_Square(r);cout<<"Ex_Square's area:"<<ptr->Area()<<endl;cout<<"Ex_Square's perimeter:"<<ptr->Perimeter()<<endl;return 0;}圆周率PI值取3.14。

InputOutputSample Input1.5Sample OutputCircle's area:7.065Circle's perimeter:9.42In_Square's area:4.5In_Square's perimeter:8.48528Ex_Square's area:9Ex_Square's perimeter:12#include <iostream>#include <cmath>using namespace std;const double PI=3.14;class Shape{public:Shape();virtual double Area()=0;virtual double Perimeter() = 0;};Shape::Shape(){}class Circle:public Shape{public:Circle(double rr);double Radius();double Area();double Perimeter();private:double r; //圆的半径};Circle::Circle(double r1){ r=r1;}double Circle::Radius (){ return r;}double Circle::Area(){ return PI*r*r;}double Circle::Perimeter(){ return 2*PI*r;}class In_Square:public Circle{public:In_Square(double rr);double Area();double Perimeter();};In_Square::In_Square(double r):Circle(r){} double In_Square::Area(){ double r=Radius();return 2*r*r;}double In_Square::Perimeter(){ double r=Radius();return 4*sqrt(2)*r;}class Ex_Square:public Circle{public:Ex_Square(double x);double Area();double Perimeter();};Ex_Square::Ex_Square(double r):Circle(r) {}double Ex_Square::Area(){ double r=Radius();return 4*r*r;}double Ex_Square::Perimeter(){ double r=Radius();return 8*r;}int main(){Shape *ptr;double r;cin>>r;ptr=new Circle(r);cout<<"Circle's area:"<<ptr->Area()<<endl;cout<<"Circle's perimeter:"<<ptr->Perimeter()<<endl;ptr=new In_Square(r);cout<<"In_Square's area:"<<ptr->Area()<<endl;cout<<"In_Square's perimeter:"<<ptr->Perimeter()<<endl;ptr=new Ex_Square(r);cout<<"Ex_Square's area:"<<ptr->Area()<<endl;cout<<"Ex_Square's perimeter:"<<ptr->Perimeter()<<endl;return 0;}1237: 多态-抽象类2Description定义一个抽象类Shape,应用抽象类Shape派生圆类Circle和长方形类Rectangle。

相关文档
最新文档