面向对象特性之多态

host
host
host
33
文章
0
评论
2017年3月17日20:36:42面向对象特性之多态已关闭评论278

多态

面向对象特性之多态

  • 多态,即多种状态(形态)。简单来说,我们可以将多态定义为消息以多种形式显示的能力。
  • 多态是以封装和继承为基础的
  • C++多态分类及实现
    1. 重载多态(Ad-hoc Polymorphism,编译期):函数重载、运算符重载
    2. 子类型多态(Subtype Polymorphism,运行期):虚函数
    3. 参数多态性(Parametric Polymorphism,编译期):类模版、函数模版
    4. 强制多态(Coercion Polymorphism,编译期/运行期):基本类型转换、自定义类型转换
  • Java多态的两种实现形式
    1. 继承:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同
    2. 接口:继承是通过重写父类的同一方法的不同子类来体现的,那么就可通过实现接口覆盖接口中的同一方法的不同的类型体现的。

 

静态多态(编译器/早绑定)

函数重载

class A
{
public:
    void do(int a);
    void do(int a, int b);
};

动态多态

  • 虚函数:用virtual修饰成员函数,使其成为虚函数
  • 动态绑定:当使用基类的引用或指针调用一个虚函数时将发生动态绑定

注意:

  • 可以将派生类的对象赋值给基类的指针或引用,反之不可
  • 普通函数(非类成员函数)不能时虚函数
  • 静态函数(static)不能是虚函数
  • 构造函数不能是虚函数(因为在调用构造函数时,虚表指针并没有在对象的内存空间中,必须要构造函数调用完成后才会形成虚表指针)
  • 内联函数不能是表现多态的虚函数,解释见:虚函数(virtual)可以是内联函数(inline)吗?

动态多态的使用

class Shape                     // 形状类
{
public:
    virtual double calcArea()
    {
        ...
    }
    virtual ~Shape();
};
class Circle : public Shape     // 圆形类
{
public:
    virtual double calcArea();
    ...
};
class Rect : public Shape       // 矩形类
{
public:
    virtual double calcArea();
    ...
};
int main()
{
    Shape * shape1 = new Circle(4.0);
    Shape * shape2 = new Rect(5.0, 6.0);
    shape1->calcArea();         // 调用圆形类里面的方法
    shape2->calcArea();         // 调用矩形类里面的方法
    delete shape1;
    shape1 = nullptr;
    delete shape2;
    shape2 = nullptr;
    return 0;
}

 

host
  • 本文由 发表于 2017年3月17日20:36:42
  • 转载请务必保留本文链接:https://www.zenook.cn/language/polymorphic.html
C/C++关键字之inline C/C++

C/C++关键字之inline

特征 相当于把内联函数里面的内容写在调用内联函数处 相当于不用执行进入函数的步骤,直接执行函数体 相当于宏,却比宏多了类型检查,真正具有函数特性 编译器一般不内联包含循环、递归、switch等复杂操作...
C++语言特性之“虚” C/C++

C++语言特性之“虚”

虚析构函数 虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象 虚析构函数的使用 class Shape { public: Shape(); // 构造函数不能是虚函数 vi...
Python的函数参数传递 Python

Python的函数参数传递

看两个例子: ### 1⃣️ a = 1 def fun(a): a = 2 fun(a) print a # 1 ### 2⃣️ a = def fun(a): a.append(1) fun(a)...
C/C++关键字之inline C/C++

C/C++关键字之inline

特征 相当于把内联函数里面的内容写在调用内联函数处 相当于不用执行进入函数的步骤,直接执行函数体 相当于宏,却比宏多了类型检查,真正具有函数特性 编译器一般不内联包含循环、递归、switch等复杂操作...