用户名: 密码: 验证码:           网站地图  高级搜索  RSS订阅  收藏本站
您的位置:主页 > 程序编程 > C++ >

C++程序设计中的多态技术研究

[ 来源:荣耀网站 | 作者:荣耀 | 更新日期:2008-4-12 21:48:54 | 人气: | 评论 0 条 ]
  导言

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

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

  函数多态

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

// 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()。
jc567.cn




  宏多态

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

// 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)分别被替换为两个整数相加和两个字符串相加的具体表达式。整数相加体现为求和,而字符串相加则体现为连接。程序的输出结果符合直觉:

1 2 = 3
hot007.com

Hello, world! = Hello, world!

  动态多态

  这就是众所周知的的多态。现代面向对象语言对这个概念的定义是一致的。其技术基础在于继续机制和虚函数。例如,我们可以定义一个抽象基类Vehicle和两个派生于Vehicle的具体类Car和Airplane:

// dynamic_poly.h

#include <iostream>

// 公共抽象基类Vehicle
class Vehicle
{
 public:
  virtual void run() const = 0;
};

// 派生于Vehicle的具体类Car
class Car: public Vehicle
{
 public:
  virtual void run() const
  {
   std::cout << "run a car\n";
  }
};

// 派生于Vehicle的具体类Airplane
class Airplane: public Vehicle
{
 public:
  virtual void run() const
  {
   std::cout << "run a airplane\n";
  }
};
www.jc567.cn
  客户程序可以通过指向基类Vehicle的指针(或引用)来操纵具体对象。通过指向基类对象的指针(或引用)来调用一个虚函数,会导致对被指向的具体对象之相应成员的调用:

// dynamic_poly_1.cpp

#include <iostream>
#include <vector>
#include "dynamic_poly.h"

// 通过指针run任何vehicle
void run_vehicle(const Vehicle* vehicle)
{
共3页: 上一页 1 [2] [3] 下一页
Tags:C++程序设计中的多态技术研究
您的评论
用户名: 新注册) 密码: 匿名评论 [所有评论]

·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为