c++的静态多态和动态多态(笔记)

本文详细探讨了C++中的静态多态(通过函数重载和运算符重载实现)和动态多态(基于虚函数和继承实现)的概念、使用场景及优缺点。通过实例解析,帮助读者深入理解这两种多态机制。
摘要由CSDN通过智能技术生成


多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形。在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。和纯粹的面向对象程序设计语言不同,C++中的多态有着更广泛的含义。除了常见的通过类继承和虚函数机制生效于运行期的动态多态(dynamic polymorphism)外,模板也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为     静态多态(static polymorphism)。
    事实上,带变量的宏和函数重载机制也允许将不同的特殊行为和单个泛化记号相关联。然而,习惯上我们并不将它们展现出来的行为称为多态(或静态多态)。今天,当我们谈及多态时,如果没有明确所指,默认就是动态多态,而静态多态则是指基于模板的多态。不过,在这篇以C++各种多态技术为主题的文章中,我们首先还是回顾一下C++社群争论已久的另一种“多态”:函数多态(function polymorphism),以及更不常提的“宏多态(macro polymorphism)”。
C++支持多种风格的编程模式称之为编程范型 C++支持的编程范型包括面向过程的基于对象的 面向对象的和泛型编程 通过指针和引用来支持多态是面向对象的编程范型区
别于基于对象的编程范型的本质所在 所谓多态  是指通过单一的标识支持不同的特定行为的能力 C++支持多种形式的多态 从绑定时间来看可以分成静态多态和动态多态也称为编译期多态和运行期多态 从表现的形式来看 有虚函数 模板重载和转换.由于静态多态在时间和空间上都比动态多态表现得好.因此在其他的条件相同的情况下 应该更多地使用


静态多态

函数多态

也就是我们常说的函数重载(function overloading)。基于不同的参数列表,同一个函数名字可以指向不同的函数定义:

// overload_poly.cpp

#include <iostream>
#include <string>

// 定义两个重载函数

int my_add(int a, int b)
{
    return a + b;
}

int my_add(int a, std::string b)
{
    return a + atoi(b.c_str());
}

int main()
{
    int i = my_add(1, 2);                // 两个整数相加
    int s = my_add(1, "2");              // 一个整数和一个字符串相加
    std::cout << "i = " << i << "\n";
    std::cout << "s = " << s << "\n";
}

根据参数列表的不同(类型、个数或兼而有之),my_add(1, 2)my_add(1, "2")被分别编译为对my_add(int, int)my_add(int, std::string)的调用。实现原理在于编译器根据不同的参数列表对同名函数进行名字重整,而后这些同名函数就变成了彼此不同的函数。比方说,也许某个编译器会将my_add()函数名字分别重整为my_add_int_int()my_add_int_str()

宏多态

带变量的宏可以实现一种初级形式的静态多态:
// macro_poly.cpp

#include <iostream>
#include <string>

// 定义泛化记号:宏ADD
#define ADD(A, B) (A) + (B);

int main()
{
    int i1(1), i2(2);
    std::string s1("Hello, "), s2("world!");
    int i = ADD(i1, i2);                        // 两个整数相加
    std::string s = ADD(s1, s2);                // 两个字符串相加
    std::cout << "i = " << i << "\n";
    std::cout << "s = " << s << "\n";
}
当程序被编译时,表达式ADD(i1, i2)ADD(s1, s2)分别被替换为两个整数相加和两个字符串相加的具体表达式。整数相加体现为求和,而字符串相加则体现为连接(注:string.h库已经重载了。程序的输出结果符合直觉:
1 + 2 = 3
Hello, + world! = Hello, world!

动态多态

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值