C++多态技术

摘要

本文描述了C++中的各种多态性。重点阐述了面向对象的动态多态和基于模板的静态多态,并初步探讨了两种技术的结合使用。

关键词

多态 继承 虚函数 模板 宏 函数重载 泛型编程 泛型模式

导言

多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形。在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。和纯粹的面向对象程序设计语言不同,C++中的多态有着更广泛的含义。除了常见的通过类继承和虚函数机制生效于运行期的动态多态(dynamic polymorphism)外,模板也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为静态多态(static polymorphism)。

事实上,带变量的宏和函数重载机制也允许将不同的特殊行为和单个泛化记号相关联。然而,习惯上我们并不将它们展现出来的行为称为多态(或静态多态)。今天,当我们谈及多态时,如果没有明确所指,默认就是动态多态,而静态多态则是指基于模板的多态。不过,在这篇以C++各种多态技术为主题的文章中,我们首先还是回顾一下C++社群争论已久的另一种“多态”:函数多态(function polymorphism),以及更不常提的“宏多态(macro polymorphism)”。

函数多态

也就是我们常说的函数重载(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()。

时间: 2024-09-19 18:09:35

C++多态技术的相关文章

C++多态技术的实现和反思

面向对象技术最早出现于1960年代的Simula 67系统,并且在1970年代保罗阿托实验室开发的Smalltalk系统中发展成熟.然而对于大部分程序员来说,C++是第一个可用的面向对象程序设计语言.因此,我们关于面向对象的很多概念和思想直接来自于C++.但是,C++在实现面向对象中关键的多态性时,选择了与Smalltalk完全不同的方案.其结果是,尽管在表面上两者都实现了相似的多态性,但是在实践中却有着巨大的区别.具体的说,C++的多态性实现更加高效,但是并不适用于所有场合.很多经验不足的C+

深入挖掘Windows脚本技术

window|脚本 [目录]1,前言2,回顾WSH对象3,WMI服务4,脚本也有GUI5,反查杀6,来做个后门7,结语8,参考资料 [前言]本文讲述一些Windows脚本编程的知识和技巧.这里的Windows脚本是指"Windows Script Host"(WSH Windows脚本宿主),而不是HTML或ASP中的脚本.前者由Wscript或Cscript解释,后两者分别由IE和IIS负责解释.描述的语言是VBScript.本文假设读者有一定的Windows脚本编程的基础.如果你对

C++ 多态分析

貌似公司面试都喜欢问多态,今天做个总结记录. 1.什么是多态 多态就是Polymorphism,一个接口的多种实现.在不同的上下问下,接口的实现表现出不同的特征. 2.多态的好处 多态带来两个明显的好处:一是不用记大量的函数名了,二是它会依据调用时的上下文来确定实现.确定实现的过程由C++本身完成另外还有一个不明显但却很重要的好处是:带来了面向对象的编程. 3.多态的实现 函数重载,宏多态,模板函数,虚函数. 3.1函数重载(function overloading) 不同的参数列表,不同的返回

面向对象编程中类设计的几个原则

1. 开闭原则(the Open Closed Principle OCP) 一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的.因此在进行面向对象设计时要尽量考虑接口封装机制.抽象机制和多态技术.该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一.我们以收音机的例子为例,讲述面向对象的开闭原则.我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节.但是对于不同的收音机,实现这三个步骤的细节往往有所不同.比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同

java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在写入一个字符时,Java虚拟机会将字符转为文件指定的编码(默认 是系统默认编码),在读取字符时,再将文件指定的编码转化为字符. 常见的码表如下: ASCII:           美国标准信息交换码.用一个字节的7位可以表示. ISO8859-1:   拉丁码表.欧洲码表,用一个字节的8位表示.又称

怎样很好的将java中的构造重载学好(初学者)

问题描述 怎样很好的将java中的构造重载学好(初学者) 现在初学,但是在写代码的时候总是无法使用构造重载这种方法,并且在写代码的时候老是思绪混乱应该怎莫办??????? 解决方案 java允许在一个类中,多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析 1 普通方法的重载 普通方法的重载是Java实现多态技术的重要手段,为编程带来了很多便利

ASP.NET 三层架构使用IDAL 接口层有什么作用,有和妙用,使用业务逻辑层BLL直接调用数据层DAL不可以嘛。

问题描述 我们通常是UIweb层调用BLL层,BLL层调用DAL达到数据的交换.但是看到大多数项目是有个IDAL接口,只是声明方法没有任何的代码实现部分,代码实现部分都放在了DAL层,然后BLL层去调用IDAL接口层的方法实现,并没有去调用DAL层,UI层调用BLL层,这里的接口层有和作用,请教各位帮忙解答,不胜感激! 解决方案 解决方案二:IDAL是DAL层的类要实现的接口.DAL层的各类需要完成对数据库的访问,但是不同的数据库需要使用不同的DAL对象,这样对于BLL层来说无法实现数据库无关性

应届生 面试东软 碰到问题 不用数据库之间的的问题

问题描述 那个面试官 问我一个项目 一会儿用ORACLE 一会用MSSQL 请问你用什么方式 实现 数据库的转换 什么的 很是郁闷 应届生问这些 解决方案 这个问题至少要答出来2方面1 orm技术使用 hibernate等支持数据库方言的东东2 使用多态技术 加上 IOC ,当你使用Oracle时,加载 Oracle的DAO,使用MySQL的时候使用MySQL的dao这个是很典型的IoC这个问题不是应不应届的问题,不要用"应届"作理由.应届不是理由,是因为你浪费的大学时光.解决方案二:

java知识难点

问题描述 第一章Java语言简介1.Java语言的平台独立性Java是一种具有平台独立性的编程语言,它在源程序级上保证了其基本数据类型与平台无关,Java源程序编译后产生的二进制代码是一种与具体机器指令集无关的指令集合,通过JVM(Java虚拟机),可以在不同的平台上运行.也就是说,JVM为我们隔离了纷繁复杂的外部网络世界,只要计算机安装了JVM,就可以一致地运行Java程序.第二章Java语法基础1.作用域的一般规则在作用域之内声明的变量对于在该作用域之外的代码不可见.这样,当在作用域中声明的