多态性实例

合集下载

多态编程实验报告

多态编程实验报告

一、实验目的1. 理解多态的概念和原理。

2. 掌握多态编程的基本方法。

3. 通过实验加深对多态编程的理解和应用。

二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:Eclipse三、实验内容1. 多态的基本概念2. 多态的实现方法3. 多态的应用实例四、实验步骤1. 多态的基本概念多态是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

在Java中,多态主要通过继承和重写方法来实现。

2. 多态的实现方法(1)继承在Java中,通过继承可以实现多态。

子类继承父类的方法和属性,可以重写父类的方法,使得子类的方法具有多态性。

(2)重写方法重写方法是指在子类中重写父类的方法,使得子类的方法具有多态性。

重写方法必须满足以下条件:- 方法名、返回类型、参数列表与父类方法相同;- 子类和父类之间必须存在继承关系。

(3)方法重载方法重载是指在同一个类中,存在多个同名方法,但参数列表不同。

方法重载可以实现多态,因为根据传入的参数列表,可以调用不同的方法。

3. 多态的应用实例下面通过一个简单的例子来展示多态的应用。

(1)创建一个动物类```javapublic class Animal {public void makeSound() {System.out.println("Animal makes a sound");}}```(2)创建两个子类,分别代表狗和猫```javapublic class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");}}public class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Cat meows");}}```(3)创建一个方法,接受一个Animal类型的参数,并调用其makeSound方法```javapublic class Test {public static void main(String[] args) {Animal dog = new Dog();Animal cat = new Cat();makeSound(dog);makeSound(cat);}public static void makeSound(Animal animal) {animal.makeSound();}}```输出结果:```Dog barksCat meows```通过上面的例子,我们可以看到,尽管我们传递的是Animal类型的参数,但在调用makeSound方法时,会根据实际对象的类型调用相应的方法,实现了多态。

实验四 虚函数与多态性

实验四 虚函数与多态性

实验四虚函数与多态性实验目的和要求 :1 了解多态性在 C++ 中的体现。

2 掌握虚函数的应用。

3 了解抽象类。

实验内容:定义一个基类为哺乳动物类Mammal,其中有数据成员年龄、重量、品种,有成员函数move()、speak()等,以此表示动物的行为。

由这个基类派生出狗、猫、马、猪等哺乳动物,它们有各自的行为。

编程分别使各个动物表现出不同的行为。

要求如下:1、从基类分别派生出各种动物类,通过虚函数实现不同动物表现出的不同行为。

2、今有狗: CAIRN:3岁,3kg;DORE:4岁,2kg;猫: CAT:5 岁,4kg;马: HORSE,5岁,60kg;猪: PIG,2岁,45kg。

3、设置一个 Mammal 类数组,设计一个屏幕菜单,选择不同的动物或不同的品种,则显示出动物相对应的动作,直到选择结束。

4、对应的动作中要先显示出动物的名称,然后显示年龄、重量、品种、叫声及其他特征。

实验原理:1.多态性:多态是指同样的消息被不同类型的对象接受时导致不同的行为,所谓消息是指对类的成员函数的调用,而不同的行为是指不同的实现,也就是调用不同的函数。

多态性从实现的角度来讲可以划分为两类:编译时的多态性和运行时的多态性。

编译时的多态性是在编译的过程中确定同名操作的具体操作对象,也就是通过重载函数来实现的。

运行时的的多态性是在程序运行过程中才动态地确定操作所针对的具体对象,使用虚函数来实现的。

2.虚函数:虚函数是重载的另一种形式,它提供了一种更为灵活的多态性机制。

虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是运行时才决定如何动作,即所谓的“动态连接”。

虚函数成员的定义:virtual 函数类型函数名(形参表)3.(1)抽象类:抽象类是一种特殊的类。

抽象类是为了抽象和设计的目的而建立的。

一个抽象类自身无法实例化,也就是说无法定义一个抽象类的对象,只能通过继承机制,生成抽象类的非抽象派生类,然后再实例化。

实验报告多态性

实验报告多态性

一、实验目的1. 理解多态性的概念及其在面向对象编程中的重要性。

2. 掌握多态性的实现方式,包括方法重载和方法覆盖。

3. 学习如何利用多态性提高代码的可读性和可维护性。

4. 通过实例分析,加深对多态性在实际编程中的应用理解。

二、实验背景多态性是面向对象编程中的一个核心概念,它允许同一个接口(或方法)根据不同的数据类型执行不同的操作。

在Java、C++等面向对象编程语言中,多态性主要通过方法重载和方法覆盖来实现。

三、实验内容1. 方法重载方法重载是指在同一个类中,允许存在多个同名方法,但参数列表不同。

编译器通过参数列表的匹配来确定调用哪个方法。

(1)实验步骤1)创建一个名为“Animal”的类,包含一个方法名为“makeSound”。

2)在“Animal”类中,添加三个重载的“makeSound”方法,分别接受不同类型的参数(如int、String、double)。

3)创建一个名为“Dog”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“Woof! Woof!”。

4)创建一个名为“Cat”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“Meow! Meow!”。

(2)实验结果当创建“Dog”和“Cat”对象时,调用“makeSound”方法会根据对象类型输出相应的声音。

2. 方法覆盖方法覆盖是指在子类中重写父类的方法,使子类的方法具有与父类方法相同的签名,但具有不同的实现。

(1)实验步骤1)创建一个名为“Vehicle”的类,包含一个方法名为“move”,该方法无参数。

2)创建一个名为“Car”的类,继承自“Vehicle”类,并重写“move”方法,使其输出“Car is moving”。

3)创建一个名为“Bike”的类,继承自“Vehicle”类,并重写“move”方法,使其输出“Bike is moving”。

(2)实验结果当创建“Car”和“Bike”对象时,调用“move”方法会根据对象类型输出相应的移动信息。

多态性与虚函数实验报告

多态性与虚函数实验报告

多态性与虚函数实验报告实验目的:通过实验掌握多态性和虚函数的概念及使用方法,理解多态性实现原理和虚函数的应用场景。

实验原理:1.多态性:多态性是指在面向对象编程中,同一种行为或者方法可以具有多种不同形态的能力。

它是面向对象编程的核心特性之一,能够提供更加灵活和可扩展的代码结构。

多态性主要通过继承和接口来实现。

继承是指子类可以重写父类的方法,实现自己的特定行为;接口是一种约束,定义了类应该实现的方法和属性。

2.虚函数:虚函数是在基类中声明的函数,它可以在派生类中被重新定义,以实现多态性。

在类的成员函数前面加上virtual关键字,就可以将它定义为虚函数。

当使用基类指针或引用调用虚函数时,实际调用的是派生类的重写函数。

实验步骤:1. 创建一个基类Shape,包含两个成员变量color和area,并声明一个虚函数printArea(用于打印面积。

2. 创建三个派生类Circle、Rectangle和Triangle,分别继承Shape类,并重写printArea(函数。

3. 在主函数中,通过基类指针分别指向派生类的对象,并调用printArea(函数,观察多态性的效果。

实验结果与分析:在实验中,通过创建Shape类和派生类Circle、Rectangle和Triangle,可以实现对不同形状图形面积的计算和打印。

当使用基类指针调用printArea(函数时,实际调用的是派生类的重写函数,而不是基类的函数。

这就是多态性的实现,通过基类指针或引用,能够调用不同对象的同名函数,实现了对不同对象的统一操作。

通过实验1.提高代码的可扩展性和灵活性:通过多态性,可以将一类具有相似功能的对象统一管理,节省了代码的重复编写和修改成本,增强了代码的可扩展性和灵活性。

2.简化代码结构:通过虚函数,可以将各个派生类的不同行为统一命名为同一个函数,简化了代码结构,提高了代码的可读性和维护性。

3.支持动态绑定:通过运行时的动态绑定,可以根据对象的实际类型来确定调用的函数,实现了动态绑定和多态性。

面向对象的三大特征之一:多态性

面向对象的三大特征之一:多态性

⾯向对象的三⼤特征之⼀:多态性⼀多态:多态指的是⼀类事物有多种形态。

⼀般是抽象的形式,它们之间是继承的关系。

import abcclass Animal(metaclass=abc.ABCMeta):@abc.abstractmethoddef run(self):pass@abc.abstractmethoddef eat(self):passclass People(Animal):def run(self):print('People is walking')def eat(self):print('People is eating ')class People(Animal):def run(self):print('People is walking')# def eat(self):# print('People is eating ')class Pig(Animal):def run(self):print('Pig is walking')def eat(self):print('Pig is eating ')分析总结:从上⾯的代码中可以看出,Animal有三种形态,分别是,⼈,狗,猪。

⽽且也体现了都是继承的关系‘猪是动物’。

多态性(1)什么是多态性(注意:多态与多态性是两种概念)多态性是指具有不同功能的函数可以使⽤相同的函数名,这样就可以⽤⼀个函数名调⽤不同内容的函数。

在⾯向对象⽅法中⼀般是这样表述多态性:向不同的对象发送同⼀条消息,不同的对象在接收时会产⽣不同的⾏为(即⽅法)。

总⽽⾔之就是在不考虑对象的类型的情况下直接使⽤对象。

(1)增加了程序的灵活性 以不变应万变,不论对象千变万化,使⽤者都是同⼀种形式去调⽤,如func(animal)(2)增加了程序额可扩展性 通过继承animal类创建了⼀个新的类,使⽤者⽆需更改⾃⼰的代码,还是⽤func(animal)去调⽤class Cat(Animal):def run(self):print('say miaomiao')def fun(obj):obj()cat1=Cat()Cat类是在上⾯的类型中新添加的,但同样可以直接使⽤fun():鸭⼦理论python是⼀种多态语⾔,崇尚鸭⼦类型。

生活实例解释面向对象的多态

生活实例解释面向对象的多态

生活实例解释面向对象的多态一、引言在现实生活中,多态是一个普遍存在的现象。

例如,动物世界中的狮子、老虎和豹,它们都属于猫科动物,但各自有着不同的特点。

同样,在人类社会中,人们从事着各种不同的职业,如医生、教师和工程师等。

这些生活实例都可以用来解释面向对象的多态。

二、多态的应用场景1.动物世界中的多态现象在动物世界中,多态现象无处不在。

以猫科动物为例,狮子、老虎和豹虽然都属于猫科,但它们在体型、毛色和习性等方面都有明显的差异。

这种多态性使得猫科动物能够在不同的生态环境中生存和繁衍。

2.人类职业的多态性在人类社会中,人们从事着各种不同的职业。

这些职业在职责、技能和待遇等方面都有所不同。

例如,医生、教师和工程师这三个职业,虽然都属于专业人士,但它们的职业特点和收入水平有很大差异。

这种多态性反映了社会分工的细化,使得人类社会能够更加繁荣发展。

三、面向对象编程中的多态1.基本概念与原理面向对象编程(OOP)是一种编程范式,它强调用对象来表示和处理问题。

多态是OOP的核心概念之一,它指的是同一操作在不同对象上具有不同的行为。

在面向对象编程中,多态主要有三种形式:继承、接口和抽象类。

2.多态的优势多态性使得程序具有更好的可扩展性和可维护性。

通过继承、接口和抽象类,我们可以轻松地为新对象添加新的行为,而无需修改原有代码。

这有助于降低代码的耦合度,提高代码的复用性。

四、多态的实现方法1.继承与多态继承是子类继承父类的属性和方法,从而实现多态。

例如,从动物类Animal继承出鸟类Bird和猫类Cat,使得Bird和Cat都具有Animal的属性和方法,但它们各自也有自己的特点。

2.接口与多态接口是一种抽象类型,它只定义了一些方法的签名,没有具体的实现。

实现类可以实现接口中的方法,从而实现多态。

例如,定义一个动物接口Animal,包含跑、跳和叫的方法。

猫类Cat和狗类Dog都可以实现这个接口,从而实现多态。

3.抽象类与多态抽象类是一种特殊的类,它不能被实例化,但可以被继承。

c类的继承和多态例子

c类的继承和多态例子

c类的继承和多态例子继承是面向对象编程中的重要概念之一,它允许一个类“继承”另一个类的属性和方法。

在C++中,继承分为三种类型:公有继承、私有继承和保护继承。

其中,公有继承是最常用的一种方式,也是实现多态的基础。

本文将通过一个例子来介绍C++中的公有继承和多态特性。

假设我们要设计一个动物园的系统,其中包含不同类型的动物。

首先,我们定义一个基类Animal,代表所有动物的共有属性和方法。

然后,派生出几个具体的动物类,如Lion(狮子)、Elephant (大象)和Monkey(猴子),它们都是Animal类的派生类。

1. 基类Animal的定义:```c++class Animal {public:Animal() {} // 构造函数virtual ~Animal() {} // 虚析构函数virtual void move() const = 0; // 纯虚函数,用于表示不同动物的移动方式protected:int age; // 年龄double weight; // 体重};```2. 派生类Lion的定义:```c++class Lion : public Animal {public:Lion(int a, double w) : Animal(), color("yellow") { age = a;weight = w;}void move() const {std::cout << "Lion is running." << std::endl;}private:std::string color; // 颜色};```3. 派生类Elephant的定义:```c++class Elephant : public Animal {public:Elephant(int a, double w) : Animal(), height(3.5) { age = a;weight = w;}void move() const {std::cout << "Elephant is walking." << std::endl; }private:double height; // 身高};```4. 派生类Monkey的定义:```c++class Monkey : public Animal {public:Monkey(int a, double w) : Animal(), num_bananas(5) {age = a;weight = w;}void move() const {std::cout << "Monkey is jumping." << std::endl;}private:int num_bananas; // 香蕉数目};```以上就是实现动物园系统的基本类定义。

多态性的几种表现形式

多态性的几种表现形式

多态性的几种表现形式2011年第3期福建电脑57多态性的几种表现形式钟治初(嘉应学院计算机学院广东梅州514015)【摘要】:多态性是面向对象程序设计的重要特性.多态性分为静态多态性和动态多态性.本文分析了多态性的几种形式.对容易引起二义性的几种情形进行了讨论.【关键词】:面向对象程序设计;多态性;二义性;继承1,引言多态性是面向对象程序设计中的一个重要特性.对于多态性的描述.通常的定义是.不同类型的对象,接受到同一个消息时,会作出不同的反应,或会出现不同的行为.程序的行为,其实本质上是通过不同的语句去实现相应的行为.对于多态性.还可以从不同的角度上来作出不同的解析.一个实体.根据当前的情况,被要求执行一个动作时.会根据实际所处的情况作出相应的处理从现在的角度上理解多态性.本质上是有一点智能的意义.当然这跟智能还相差很远.使用多态性的其中一个目的是软件重用.多态性也是程序执行时根据情况灵活运行的一个要求目前可以实现这种灵活性的机制还不是很多,主要体现在函数的重载和虚函数两个方面.当然.现在的模板包括函数模板和类模板本质上也可以认为是一种多态性的表现.多态性也可以认为是一个语法单位,在不同的环境会有不同的解释.或者说有不同的语义.目前这种在不同环境下对同一语法单位的不同解释还必须有明确的限定.否则.限定过少会出现所谓的二义性.在当前条件下二义性是不被允许的.多态性源自于面向对象技术.在现实世界中很多实体都具有多态的特征.用程序来描述现实世界中的实体.也要求能实现多态性的功能.可以认为,编程技术也会不断地发展.程序的描述能力将会越来越接近于现实世界.面向对象的技术包括类,对象,继承,多态这些基本特性.如果只支持类和对象.只能说是基于对象的程序设计技术.只有支持继承和多态的程序技术, 才能认为是面向对象的程序设计技术.C++中的多态性包括静态多态性和动态多态性两类.静态多态性通常称为编译时多态性,通常用函数重载来实现.动态多态性通常称为运行时多态性,通常用虚函数来实现.函数的重载包括普通函数的重载和类的成员函数的重载两种运算符的重载可以归类为函数的重载用虚函数来实现动态多态性只有在类的继承中才有意义2,静态多态性静态多态性通常称为编译时多态性.在C++中是通过函数重载来实现的.运算符的重载通常被认为是函数重载的特殊情形.属于运算符函数的重载.理论上来讲.函数模板通常也可以认为是一种静态多态性的表现形式.所谓函数重载,是指函数名相同,但函数的参数的类型,个数,顺序有所不同,当调用函数时,编译程序会根据所给的实参的类型,个数,顺序的不同情况来决定具体调用的函数.对重载函数的调用.不允许出现二义性.而且还要注意.有些情况表面上看是函数重载.实际上会引起调用的二义性.也是不被允许的.下面具体分析一下有些会引起二义性的函数重载和不被允许的函数重载TypelFunctionl(Type2a[]);TypelFunction1(Type2a);上面的两个函数表面上参数的类型不一样.但实际上是重复的两个函数.因此是不被允许的函数重载. TypelFunction2(Type2x);TypelFunction2(Type2&amp;x);上面的两个函数表面上类型也有所差别.但调用时也会出现二义性.因为如果定义了变量:Type2a:调用Function2(a1:时会出现二义性. TypelFunction3(Type2&amp;x);TypelFunction3(con§tType2&amp;x);上面的两函数表面上参数的类型也有所不同.但调用的时候也同样会出现二义性函数的重载和函数的带默认参数值也会引起二义性,因此也要引起注意.如下面的函数: voidFunction4(intx=0,inty=0,intz=o);voidFunction4(inta,intb);voidFunction4(intk1:三个函数的参数的个数虽然有所不同.但调用的时候也会出现二义性,因此.原则上也是不被允许的. 若有多个重载函数同时被定义.则在调用时不出现二义性是允许的.但原则上会出现二义性的重载函数.其实都是不好的处理方法.尽可能避免出现这样的函数重载.很多情况下函数重载的定义是允许的.只是调用的时候才发现出现了二义性.比如上面的Func 58福建电脑2011年第3期tion2()其实是允许的,只要调用的时候不出现二义性是可以的.比如下面的常量定义及相应的调用是可以的:constType2a=ConstExp1;Function2(a);但是如果定义了下面的变量和相应的调用.则出现了二义性:Type2b=Exp2;Function2(b);因为这个调用二个函数都可以解释得通.既然如此,就无法确定调用的是哪一个,因此,就不被允许.运算符的重载属于函数重载的特殊情形.因为运算符解释为运算符函数,例如,A+B通常解释成opera. tor+(A,B),如果是类的成员函数则解释成A.operator+ (B).运算符函数可以定义成类的成员函数,也可以定义成类的友元函数.同时也可以定义成普通函数,这个普通函数既不是类的成员也不是类的友元.此时类的成员函数要求比较多,效率不够高.下面的程序例子中就定义了不同情形的重载运算符+:classPoint{private:intx,y;public:Point(intxO=O,inty0=0){x=x0;y=y0;} Pointoperator+(Point&amp;p){returnPoint(x+p.y+p.y);)int~tx0{returnx;】intGety0{returny.】voidSet(intxO=O,inty0=0){x=x0;y=y0;}1;classV ector{private:intx,y;public:V ector(intx0=O,inty0=0){x=x0;y=y0;}V ectoroperator+(V ector&amp;p){returnV ector(x+p.)【'y+p.y);】intC~tx0{returnx;IintGety0{returny;}voidSet(intxO=-0,intyO=-0){x=x0;y=yO;ll;Pointoperator+(Pointpl,V ectorp2){Pointp;p.Set(p1.Getx0+p2.Getx0,p1.Gety0+p2.GetyO); returnp;】V ectoroperator+(V ectorpl,Pointp2){Vectorp;p.Set(p1.Getx0+p2.GetxO,p1.Gety0+p2.Gety0); returnp;l两个不同的类的对象之间事实上也可以进行运算,而且这个运算符重载成普通的函数.当然,每一次运算都要调用类的成员函数.运行的效率相对要低一点.3,动态多态性在C++中动态多态性是通过虚函数来实现的.这种多态只有出现类的继承和派生时在能起作用.如果没有类的继承和派生.虚函数是没有什么意义的.在一个类中,虚函数是通过一个虚函数表来实现的.尽管单个类中虚函数不能起到什么作用.但一个类中的函数是否为虚函数.在建立该类的对象时,对象的存储空间的尺度是有区别的.例如下面的两个类中.其成员函数一个是虚函数.另一个是非虚函数.则建立这两个类的对象时,存储空间的尺度分别是4和8,这就是差别. classPointlfprate:intx;public:voidf0(eout&lt;&lt;…x'&lt;&lt;endl;】};classPoint2{private:intx;public:virtualvoidf0(tout&lt;&lt;…X'&lt;&lt;endl;)l;这说明虚函数需要另外的存储空间用于特别的处理在有继承关系的类中.只要基类中定义了虚函数.则其所有派生类中的同名函数都认为是虚函数.都能达到动态多态的目的.例如下面的类继承中,只有最上层的基类中定义了虚函数.则其所有派生类中都保持虚函数的特性.classBase{public:virtualvoidf0{cout&lt;&lt;"Base"&lt;&lt;endl;}l;classClassA:publieBase{public:voidf0{cout&lt;&lt;"ClassA"&lt;&lt;end1.】】;classClassB:publicClassA{public:voidfO{eout&lt;&lt;"ClassB"&lt;&lt;endl;l};能够实现动态多态性的虚函数.在派生类的定义必须同基类的参数完全一致.否则将会被认为是函数的覆盖.函数的覆盖就起不到多态的作用.动态多态目前只能通过指针或引用来调用虚函数才能实现多态.4,结束语多态性中非常有意义的一种性质.目前能够实现的多态是根据参数的不同,或者根据当前的对象的不同,可以实现多态.将来是否有其他的机制来实现其他的多态性质呢?其他情形的多态又可以用什么来描述呢?参考文献:【1】WalterSavitch着,周靖译,c++面向对象程序设计【M】,北京: 清华大学出版社.2007【2]钱能着,c++程序设计教程一一设计思想与实现[M】,北京:清华大学出版社.2009[3】沈显君,杨进才,张勇编着,c++语言程序设计教程【M】,北京:清华大学出版社,2010。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使 用 继 承 性 的 结 果 就 是 可 以 创 建 一 个 类 的 家 族 ,在 认 识 这 个 类 的 家 族 时 ,就 是 把 导出类的对象当作基类的对象,这种认识又叫作 upcasting。这样认识的重要性在于: 我 们 可 以 只 针 对 基 类 写 出 一 段 程 序 ,但 它 可 以 适 应 于 这 个 类 的 家 族 ,因 为 编 译 器 会 自 动 就 找 出 合 适 的 对 象 来 执 行 操 作 。这 种 现 象 又 称 为 多 态 性 。而 实 现 多 态 性 的 手 段 又 叫 称动态绑定(dynamic binding)。
简 单 的 说 ,建 立 一 个 父 类 的 对 象 ,它 的 内 容 可 以 是 这 个 父 类 的 ,也 可 以 是 它 的 子 类的,当子类拥有和父类同样的函数,当使用这个对象调用这个函数的时候,定义这 个对象的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加 virtual 关键字,那么子类的同名函数将被调用。
private: double width; double height;
};
//派生类:圆类 class Circle:public Shape { public:
Circle(double x) {
radius = x; } double Area()
{ cout<<"this is Circle Area,the Area is:"<<PI*pow(radius,2)<<endl; return (double)PI*pow(radius,2);
实例程序
#include <iostream> #include <cmath> using namespace std; #define PI 3.1415926
//基类:Shape 类 class Shape { public:
Shape(){} virtual double Area() {
cout<<"this is Shape Area."<<endl; return 0; }
private:
};
//派生类:矩形类 class Rectangle:public Shape { public:
Rectangle(double x, double y) {
width = x; height = y; } double Area() { cout<<"this is Rectangle Area,the Area is:"<<width*height<<endl; return (double)width*height; }
C++多态性概念、作用及实例
概念
多 态 指 同 一 个 实 体 同 时 具 有 多 种 形 式 。 它 是 面 向 对 象 程 序 设 计 ( OOD ) 的 一 个 重 要 特 征 。如 果 一 个 语 言 只 支 持 类 而 不 支 持 多 态 ,只 能 说 明 它 是 基 于 对 象 的 ,而 不 是 面 向 对 象 的 。C++ 中 的 多 态 性 具 体 体 现 在 运 行 和 编 译 两 个 方 面 。运 行 时 多 态 是 动 态 多 态 , 其 具 体 引 用 的 对 象 在 运 行 时 才 能 确 定 。编 译 时 多 态 是 静 态 多 态 ,在 编 译 时 就 可 以 确 定 对象使用的形式。
} private:
double radius; };
//主程序 void main() {
cout<<"虚函数多态实例:"<<endl; //定义基类对象 Shape * shape; //使用基类初始化 shape = new Shape(); shape->Area();
//使用基类指针调用派生类的实现函数 shape = new Rectangle(2rcle(3); shape->Area(); }
C++ 中 , 实 现 多 态 有 以 下 方 法 : 虚 函 数 , 抽 象 类 , 重 载 , 覆 盖 。
作用
把 不 同 的 子 类 对 象 都 当 作 父 类 来 看 ,可 以 屏 蔽 不 同 子 类 对 象 之 间 的 差 异 ,写 出 通 用 的 代 码 ,做 出 通 用 的 编 程 ,以 适 应 需 求 的 不 断 变 化 。赋 值 之 后 ,父 对 象 就 可 以 根 据 当 前 赋 值 给 它 的 子 对 象 的 特 性 以 不 同 的 方 式 运 作 。也 就 是 说 ,父 亲 的 行 为 像 儿 子 ,而 不 是 儿 子 的 行 为 像 父 亲 。举 个 例 子 :从 一 个 基 类 中 派 生 ,响 应 一 个 虚 命 令 ,产 生 不 同 的结果。比如从某个基类继承出多个对象,其基类有一个虚方法 Tdoit,然后其子类 也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类的对象, 这 样 其 基 类 的 对 象 就 可 以 执 行 不 同 的 操 作 了 。实 际 上 你 是 在 通 过 其 基 类 来 访 问 其 子 对 象的,你要做的就是一个赋值操作。
相关文档
最新文档