关于多态的讨论

首先来看看多态的定义,这里引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。多态在C++中是通过虚函数(virrtual)实现的。C++中,实现多态有以下方法:虚函数抽象类,重载,覆盖,模板。面向对象最强大的地方就是多态,而不是继承。

C++支持两种多态:

1. 编译时多态:通过重载函数实现;

2. 运行时多态:通过虚函数实现。

编译时多态比较简单,下面主要谈谈运行时多态。

-------------------------------------------------------------------------------------------------------------------------------------------

基类类型的指针可以指向任何基类对象或派生类对象,指向哪个对象就调用相应对象的函数。

需要注意的是:1.当声明了基类的一个成员函数为虚函数后,那么即使该成员函数没有在派生类中被显式地声明为虚函数,但它在所有派生类中也将自动称为虚函数;2.如果虚函数在类声明外定义,关键字仅在函数声明时需要,不需在函数定义中使用virtual关键字;3.
最好将所有的声明前加上virtual关键字,以避免用户产生疑惑。

来看个例子:

#include <iostream>

using namespace std;

class parent
{
public:
    parent(){}
    void out()
    {
        cout << "1" << endl;
    }

    virtual void fun()
    {
        cout << "2" << endl;
    }
};

class child:public parent
{
public:
    child(){}
    void out()
    {
        cout << "3" << endl;
    }

    void fun()
    {
        cout << "4" << endl;
    }
};

int main()
{
    parent par;
    child chi;
    parent* p = ∥
    p->out();
    p->fun();
    p = χ
    p->out();
    p->fun();
    if(p != NULL)
        delete p;

    child* q =(child*)∥
    q->out();
    q->fun();

    if(q != NULL)
        delete q;
    return 0;
}

结果是:

让我们来分析一下:

第一部分p->out()和p->fun()很好理解,基类指针指向基类对象,调用的都是基类本身的函数,结果是1、2;

第二部分p->out()和p->fun()是基类指针指向子类对象,这就是多态的用法。p->out()是基类指针指向固定偏移量(相对于基类)的函数,输出结果是1;p->fun()是基类指针指向虚函数列表,根据指向的对象不同,通过虚函数列表找到相应的函数,这里找到的是子类的fun()函数地址,输出结果是4;第三部分p->out()是子类指针指向固定偏移量(相对于子类)的函数,输出结果是3;p->fun()是子类指针指向虚函数列表,根据指向的对象(这里是基类)不同,输出结果是2。

时间: 2024-10-22 02:57:09

关于多态的讨论的相关文章

深入Java核心 Java中多态的实现机制(1)

多态性是Java面向对象的一个重要机制,本文将向您详细介绍Java语言中多态性的实现原理和方法,通过多态一点带出更多Java面向对象有趣而实用的知识. 多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次深入Java核心,一起学习Java中多态性的实现. “polymorphism(多态)”一词来自希腊语,意为“多种形式”.多数Java程序员把多态看

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

多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次深入Java核心,一起学习Java中多态性的实现. “polymorphism(多态)”一词来自希腊语,意为“多种形式”.多数Java程序员把多态看作对象的一种能力,使其能调用正确的方法版本.尽管如此,这种面向实现的观点导致了多态的神奇功能,胜于仅仅把多态看成纯粹的概念. Java中的多态总是子类型

java-面向对象的多态性摘要

多态的作用就是用来将接口和实现分离开,改善代码组织结构,增强代码可读性,便于代码的维护. 在java中,讨论多态就是讨论方法调用的绑定,绑定就是将一个方法调用同一个方法主体联系起来.在java中通常叫做"运行时绑定",也称"后期绑定".例如: 1.定义一个基类 public class Parents{ public void print(){ System.out.println("parents"); } } 2.定义两个派生类 public

抽象类与接口 day-11.2

通常可以说四边形具有4条边,或者更具体点,平行四边形是具有对边平行且相等特性的特殊四边形,等腰三角形是其中两边相等的三角形,这些描述都是合乎情理的,但是对于图形对象却不能使用具体的语言进行描述,他有几条边,究竟是什么图像,没有人能说清楚,这种类在java中被定义为抽象类. 一:抽象类 在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理.回想继承与多态的原理,继承树中越是在上边的类越抽象,如鸽子类继承鸟类,鸟类继承动物类等.在多态机制中,并不需要将父类初始化对象,我们需要

Python虚拟机类机制之自定义class(四)

用户自定义class 在本章中,我们将研究对用户自定义class的剖析,在demo1.py中,我们将研究单个class的实现,所以在这里并没有关于继承及多态的讨论.然而在demo1.py中,我们看到了许多类的内容,其中包括类的定义.类的构造函数.对象的实例化.类成员函数的调用等 demo1.py class A(object): name = "Python" def __init__(self): print("A::__init__") def f(self):

java多态/重载方法——一个疑难代码引发的讨论

直接上代码,看这个代码发现自己的基础有多差了.参考 http://www.cnblogs.com/lyp3314/archive/2013/01/26/2877205.html和http://hxraid.iteye.com/blog/428891 以及 <深入Java虚拟机> 这个问题是java获取动态绑定最终的方法?涉及的知识有继承.多态.重载.方法调用的整合. public class Poly { public static void main(String[] args) { A a

Java基础(八):多态

一.多态的理解: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现:现实中,比如我们按下 F1 键这个动作:如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档:如果当前在 Word 下弹出的就是 Word 帮助:在 Windows 下弹出的就是 Windows 帮助和支持:同一个事件发生在不同的对象上会产生不同的结果. 二.多态的优点和必要条件: 多态的优点:1. 消除类型之间的耦合关系2

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

多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态.编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话.对不同类的对象发出相同的消息将会有不同的行为.比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可

GeekBand-secondweek-c++的多态和虚函数

多态与虚函数 13章的简单继承只是实现了对已有对象的实现的重定义和直接调用,但是向上映射导致的对象切割仍然是个缺陷: 1.延续13章的向上映射 简单继承中,派生类重定义了基类的成员函数,此时,向上映射的结果是很明显的,它使用了基类实现的函数版本,这显然并不是我们想要的效果:为什么会有这样的结果发生,我们先探讨几个问题: 函数调用绑定:函数调用确定目标函数体称为捆绑,编译期绑定称为早绑定,上面的问题就是早绑定引起的,因为编译器只知道基类对象的类型,调用函数也会绑定基类实现的函数版本,要解决这一问题