c++多态特性的小小总结

原创 2016年09月24日 16:19:07

1. 多态的含义:

多态是面向对象语言的重要特性,是指不同对象接收到同一消息时会产生不同的行为。是处理类的层次结构之间以及同一个类内部同名函数的关系问题。简单地说,多态就是在同一个类或继承体系结构的基类与派生类中,用同名函数来实现不同的功能。多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。

2. 概念:

重写(覆盖):两个函数具有相同函数名,返回类型,参数表。

重载:函数或者方法有相同的名称。

静态多态性:采用静态联编的方式实现的多态,所谓静态联编是通过函数重载和运算符重载实现的。

动态多态性:通过继承和虚函数,在程序执行时通过动态绑定实现的。

虚函数:我们知道当基类对象的指针指向派生类对象时,只能通过它访问到派生类中的基类子对象。虚函数只能在类中定义,即只能把类的成员函数声明为虚函数,不属于任何类的普通函数不能被定义为虚函数。虚函数的运行机制可以概括为:如果基类中的非静态成员函数被定义成为虚函数,且当派生类重写了该函数,当通过指向基类对象的指针或引用调用派生类对象中的虚函数时,就会调用该指针(或引用)实际所指对象的成员函数。一旦将某个成员函数声明为虚函数后,它在类的继承体系中就永远的为虚函数了。即派生类重写该函数是并没有把它声明为虚函数,它仍然为虚函数。
普通例子:

#include <iostream>
using namespace std;
class A{
public:
    virtual void print(){cout << "A...." <<endl;}//声明为虚函数
};
class B:public A{
public:
    void print(){cout << "B...." <<endl;}
};
class C:public B{
public:
    void print(){cout << "C...." <<endl;}
};
int main()
{
    A *pa;
    B b;
    A &rm = b;
    pa = &b;
    pa->print();
    rm.print();

    C c;
    A &rm1 = c;
    pa = &c;
    pa->print();
    rm1.print();
    return 0;
}

一种特殊形式:

#include <iostream>
using namespace std;
class B{
public:
    void f(){g();}
    virtual void g(){cout << "B:g()";}
};
class D:public B{
public:
    void g(){cout << "D:g()";}
};
int main()
{
    D d;
    d.f();
    return 0;
}

虚析构函数:c++允许将析构函数定义为虚函数(构造函数不能使虚函数),在继承体系结构中,如果基类的析构函数是虚函数,则所有的直接或间接从基类派生的类的析构函数都是虚函数。在销毁通过基类指针和引用调用的派生类对象时,虚析构函数可以确保能够彻底地对象占用的内存空间。在销毁自由存储空间中用new建立的对象时,虚析构函数可以确保在用delete销毁动态分配的派生类对象时调用到正确的析构函数,完成对象所占用空间的回收。典型情况是当用基类对象的指针或引用调用派生类对象时,如果基类析构函数不是虚函数,则通过基类指针或引用对派生类的析构很可能是不彻底的。

纯虚函数与抽象类:抽象类是通过纯虚函数来实现的。纯虚函数在基类中声明,但它在基类中没有具体的函数实现代码,要求继承它的派生类提供函数实现代码。在一个类中可以声明一个或多个纯虚函数,只要有纯虚函数的类就是抽象类。抽象类只能作为其他类的基类,不能用来建立对象,所以又叫抽象基类。可以通过抽象类对象的指针或引用访问到它的派生类对象,实现运行时的多态性。如果派生类只是简单地继承了抽象类的纯虚函数,而没有重现定义基类的纯虚函数,则派生类也是一个抽象类。

#include <iostream>
using namespace std;
class Figure{
protected:
    double x,y;
public:
    void set(double i,double j){x=i,y=j;}
    virtual void area() = 0;
};
class Triangle:public Figure{
public:
    void area(){cout << "三角形面积为:" << x*y*0.5<<endl;}
};
class Rectangle:public Figure{
public:
    void area(int i){cout << "矩形面积为:" << x*y <<endl;}
};
int main()
{
    Figure *pF;
    //Figure f1;//错误,因为抽象类不能实例化
    //Rectangle r1;//错误,因为它还是一个抽象类
    Triangle t;
    t.set(10,20);
    pF = &t;
    pF->area();
    Figure &rF = t;
    rF.set(20,20);
    rF.area();
    return 0;
}

c++继承和多态的一点小小的理解

在这里写东西,多半是给自己看的。初衷是想记录一下自己的点点滴滴。 1、继承: 说道继承,就必然有子类和父类。子类继承父类的一些成员变量,成员函数。继承的方式可以分为public,protected,p...

C++四大特性——多态 的总结

我们都知道,C语言和C++的区别就是,C语言是面对过程的程序设计,而C++是面对对象的程序设计。面对对象的程序设计有4大特性:分别是,抽象、封装、继承、多态。今天我们就来总结一下多态的内容。多态:分为...

C++基础之三大特性之多态(顾客,别走啊,我这是羊肉,不是狗肉啊)

C++基础之三大特性之多态(顾客,别走啊,我这是羊肉,不是狗肉啊)

C语言实现C++面向对象语言多态特性

我们知道,C++语言演化过程中,加入了不少新特性,使其成为一门现代高级OO语言。当初C++在上个世纪七十年代末,80年代初时,C++发展刚刚起步,那时C++可以看作C with class,C++编写...

深入理解C++三大特性之一 ——多态

1.多态的实现效果 多态:同样的语句调用能呈现不一样的表现形态; 2.多态实现的三个条件 a)继承 b)virtual关键字修饰 c)父类指针指向或引用子类对象 ...

C++三大特性之多态

多态 编译环境:VS2013 一、对象类型 在引入多态之前,我们先来看一下对象类型   二、多态性的概念      多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,在C++中是指...

C++三大特性——多态

1、什么是多态?多态:从名字上看就是多种状态,形态, 举个简单的例子: 一个操作符 :&当&放在一个变量前面,就是区地址操作符;放在类型后面,一般就是引用了。 多态分为两种: 静态多态:在...

C++的多态特性

 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允...
  • muzhiai
  • muzhiai
  • 2014年04月17日 10:36
  • 754

C++中三个特性(继承、封装、多态、类之间的关系)

转载来自: http://www.cnitblog.com/Lily/archive/2013/01/03/6860.html http://blog.csdn.net/maybehelios...
  • left_la
  • left_la
  • 2013年04月23日 11:10
  • 1537

C++三大特性封装继承多态

C++三大特性封装继承多态,继承方式方法,多态实现的必要条件 , 函数重载、覆盖(重写),隐藏(重定义)的区别。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++多态特性的小小总结
举报原因:
原因补充:

(最多只允许输入30个字)