动态多态与静态多态

简介: 动态多态与静态多态

动态多态与静态多态

概述

  • 动态多态(动态绑定):即运行时的多态,在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法,在发生继承中,对父类中的带有virtual修饰的函数进行重写,类似于Java中的接口。
  • 静态多态:也称为编译期间的多态,编译器在编译期间完成的,在发生继承中,对父类的同名函数进行重定义(虚函数除外),重定义只用函数名相同即可,其他均可不同,就会将父类的同名函数屏蔽,这个时候想要访问父类的同名函数的话,需要加上作用域。静态多态实现方式:
  • 函数重载:包括普通函数的重载和成员函数的重载
  • 函数模板的使用

案例讲解

动态多态

学习代码

#include<iostream>
using namespace std;
class A
{
public:
    A(){
    }
    virtual ~A(){
        cout << "A discontruct" << endl;
    }
  virtual string OnPaint() = 0; // 定义接口
};
class B : public A
{
public:
  virtual string OnPaint()
  {
    cout<< "B" << endl;
    return "B";
  }
  virtual ~B(){
      cout << "B discontruct" << endl;
  }
};
class C : public A
{
public:
  virtual string OnPaint()
  {
    cout<< "C" << endl;
    return "C";
  }
  virtual ~C(){
      cout << "C discontruct" << endl;
  }
};
int main()
{
  A* p = new B();
  p->OnPaint(); // B
  delete p;
  p = new C(); 
  p->OnPaint(); // C
  delete p;
  return 0;
}

运行结果

静态多态

学习代码

  • 使用模板
// 交换两个值,但是不清楚是int 还是 double,如果不使用模板,则要写两份代码
// 使用函数模板,将类型作为参数传递
template<class T>
class Swa(T a,T b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
};
  • 继承关系
#include<iostream>
using namespace std;
class A
{
public:
    A(){
    }
    ~A(){
    }
  void OnPaint(){
      cout << "A" << endl;
  }
};
class B : public A
{
public:
  string OnPaint()
  {
    cout<< "B" << endl;
    return "B";
  }
};
class C : public A
{
public:
  string OnPaint()
  {
    cout<< "C" << endl;
    return "C";
  }
};
int main()
{
  // 静态多态的函数返回值等等都可以改变
  A* p = new B();
  p->OnPaint(); // A
  delete p;
  p = new C(); 
  p->OnPaint(); // A
  delete p;
  return 0;
}

运行结果

相关文章
|
2月前
实现多态的多种方式
【10月更文挑战第19天】这些多态的实现方式各有特点,在不同的场景中可以灵活运用,以提高代码的灵活性、可扩展性和复用性。
110 63
|
2月前
多态和动态绑定的区别是什么?
【10月更文挑战第14天】多态和动态绑定是面向对象编程中两个重要的概念,但它们有着不同的含义和作用。
32 2
|
7月前
|
C++ 开发者
C++程序中利用虚函数实现动态多态性
C++程序中利用虚函数实现动态多态性
68 2
|
7月前
|
存储 安全 编译器
【C/C++ 多态核心 20240115更新】C++虚函数表:让多态成为可能的关键
【C/C++ 多态核心 20240115更新】C++虚函数表:让多态成为可能的关键
62 0
|
C++
47 C++ - 继承中的静态成员特性
47 C++ - 继承中的静态成员特性
48 0
|
Java
面向对象编程基础:类、对象、封装、继承和多态
面向对象编程基础:类、对象、封装、继承和多态
114 0
|
Java C++
面对对象三大特性:封装、继承、多态
面对对象三大特性:封装、继承、多态
动态绑定,多态(带你从本质了解多态)(下)
动态绑定,多态(带你从本质了解多态)
动态绑定,多态(带你从本质了解多态)
动态绑定,多态(带你从本质了解多态)