首页 |缤纷校园 |心理援助 |英语世界 |公务员 |考研天地 |资格考试 |电脑认证 |免费论文 |实用文档 |求职就业 |论坛 |网络课堂 |留言版
 电脑认证首页     考试专题 考试提醒 计算机等级考试 计算机认证水平考试 IT认证 论坛
 最近更新
· [学习辅导]MoreEffectiveC++:不使用…
· [学习辅导]Linux下C++异常处理技巧--…
· [学习辅导]VPN管理未来发展的方向:目…
· [学习辅导]网络连通测试方法巧用网络…
· [学习辅导]Java中有返回值的方法与循…
· [计算机专题]用javascript模拟C#的[Att…
· [学习辅导]J2SE综合:深入了解Java5.…
· [学习辅导]Javascript所有对象的属性…
· [备考指南]谈谈学习方法和ccna的重要…
· [计算机专题]SOA提供四大基本收益增加企…
 精品课程
· [精品课程推荐]08年投资项目管理师考…
· [精品课程推荐]08年职称日语考试辅导…
· [精品课程推荐]08年环境影响评价师辅…
· [精品课程推荐]08年质量资格考试辅导…
· [精品课程推荐]08年会计职称辅导报精…
· [精品课程推荐]08年建筑师考试辅导京…
· [精品课程推荐]08职称英语考试辅导王…
· [精品课程推荐]08年咨询工程师考试名…
· [精品课程推荐]08年监理工程师考试辅…
· [精品课程推荐]经济师考试网上辅导报…
 考试动态
· [二级考试动态]2008年计算机等级考试时间…
· [二级考试动态]上海:2008年上半年全国计…
· [二级考试动态]北京:2007年9月计算机等级…
· [二级考试动态]2007年12月全国计算机职业…
· [二级考试动态]青岛:2008年上半年计算机…
· [二级考试动态]宁夏:2007年9月计算机等级…
· [二级考试动态]北京地区计算机等级考试10…
· [二级考试动态]北京:07年下半年计算机等…
· [二级考试动态]2008年4月全国计算机等级考…
· [二级考试动态]2007年下半年计算机等级考…
 试题下载
· [试题下载]2007年计算机等级考试二级…
· [试题下载]2007年9月计算机等级考试二…
· [试题下载]2007年9月二级VB试题答案
· [试题下载]2007年9月计算机二级VB模拟…
· [试题下载]2007年9月计算机二级VB模拟…
· [试题下载]2007年9月计算机二级VF模拟…
· [试题下载]2007年9月计算机二级VB模拟…
· [试题下载]2007年9月计算机等级考试二…
· [试题下载]VC++中利用/GS开关防止缓冲…
· [试题下载]2007年4月计算机等级考试二…
 学习辅导
· [学习辅导]MoreEffectiveC++:不使用…
· [学习辅导]Linux下C++异常处理技巧--…
· [学习辅导]如何使编译后的程序运行时…
· [学习辅导]2007年计算机二级VF编辑
· [学习辅导]2007年C语言辅导:可移植性
· [学习辅导]2007年制作风格独特的按钮
· [学习辅导]2007年VFP中使用Grid控件设…
· [学习辅导]MoreEffectiveC++之考虑变…
· [学习辅导]C++/CLI解析之基于堆栈的对…
· [学习辅导]C++builder的文件读写操作…
 

MoreEffectiveC++:不使用多态性数组

文章录入:admin    责任编辑:admin   2008-2-27 14:22:31  来源:考资网  点击数:
 
  类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性,就好像它们同时具有多种形态。C++允许你通过基类指针和引用来操作派生类数组。不过这根本就不是一个特性,因为这样的代码根本无法如你所愿地那样运行。

  假设你有一个类BST(比如是搜索树对象)和继承自BST类的派生类BalancedBST:

class BST { ... };
class BalancedBST: public BST { ... };

  在一个真实的程序里,这样的类应该是模板类,但是在这个例子里并不重要,加上模板只会使得代码更难阅读。为了便于讨论,我们假设BST和BalancedBST只包含int类型数据。

  有这样一个函数,它能打印出BST类数组中每一个BST对象的内容:

void printBSTArray(ostream& s,
const BST array[],
int numElements)
{
 for (int i = 0; i < numElements; ) {
  s << array[i]; //假设BST类
 } //重载了操作符<<
}

  当你传递给该函数一个含有BST对象的数组变量时,它能够正常运行:

BST BSTArray[10];
...
printBSTArray(cout, BSTArray, 10); // 运行正常

  然而,请考虑一下,当你把含有BalancedBST对象的数组变量传递给printBSTArray函数时,会产生什么样的后果:

BalancedBST bBSTArray[10];
...
printBSTArray(cout, bBSTArray, 10); // 还会运行正常么?

  你的编译器将会毫无警告地编译这个函数,但是再看一下这个函数的循环代码:

for (int i = 0; i < numElements; ) {
 s << array[i];
}

  这里的array[I]只是一个指针算法的缩写:它所代表的是*(array)。我们知道array是一个指向数组起始地址的指针,但是array中各元素内存地址与数组的起始地址的间隔究竟有多大呢?它们的间隔是i*sizeof(一个在数组里的对象),因为在array数组[0]到[I]间有I个对象。编译器为了建立正确遍历数组的执行代码,它必须能够确定数组中对象的大小,这对编译器来说是很容易做到的。参数array被声明为BST类型,所以array数组中每一个元素都是BST类型,因此每个元素与数组起始地址的间隔是be i*sizeof(BST)。

  至少你的编译器是这么认为的。但是如果你把一个含有BalancedBST对象的数组变量传递给printBSTArray函数,你的编译器就会犯错误。在这种情况下,编译器原先已经假设数组中元素与BST对象的大小一致,但是现在数组中每一个对象大小却与BalancedBST一致。派生类的长度通常都比基类要长。我们料想BalancedBST对象长度的比BST长。如果如此的话,printBSTArray函数生成的指针算法将是错误的,没有人知道如果用BalancedBST数组来执行printBSTArray函数将会发生什么样的后果。不论是什么后果都是令人不愉快的。

  • 上一个文章:

  • 下一个文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    关于本站 - 广告服务 - 站内导航 - 网站声明 - 友情链接 - 联系我们
    Copyright©2003-2008 www.dastu.com, All Rights Reserved.

    心语心愿科技(北京)有限责任公司 版权所有

    鄂ICP备05000022号