More Effective C++议题【三】:不要对数组使用多态

原创 2013年12月03日 15:23:55

<<More Effective C++>> 学习笔记【三】

这个议题的实际意义在于对多态的size要有清晰的理解和把控。建议中给出了如下出错代码 :

//注意!这是错误的代码
class BST { ... };
class BalancedBST: public BST { ... };

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

//对数组使用多态
    BST BSTArray[10];
    //...
    printBSTArray(cout, BSTArray, 10); // 运行正常

    BalancedBST bBSTArray[10];
    //...
    printBSTArray(cout, bBSTArray, 10);//出错!

其实对于嵌入式或者C程序员来讲,这里的错误很好理解:

printBSTArray函数中的对数组array[]的遍历操作实际上通过指针的移动进行,而每次移动的大小在本例中则是sizeof(BST)。

那么多态在这种情况下的移动会产生内存大小的不确定性。

这个建议很好理解。不再多话。



相关文章推荐

《more effective c++》Item M3:不要对数组使用多态

类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性,就好像它们同时具有多种形态。C++允许你通过基类指针和引用来操作派生类数组。不过这根本就不是一个特性,因为...

More Effective C++----(1)指针与引用的区别 & (2)尽量使用C++风格的类型转换 & (3)不要对数组使用多态

Item M1:指针与引用的区别 指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使...

More Effective C++议题【二】:尽量使用C++风格的类型转换

> 学习笔记【一】 C风格的类型转换的缺点: 过于粗鲁: 允许在任何类型间进行转换。代码阅读时在程序语句中难以识别。 其中第一点在转换不同行为类型中体现出了巨大的差异性,建议中的例子包括 :...

More Effective C++议题【四】:避免无用的缺省构造函数

> 学习笔记【四】 这个议题讨论的是缺省构造函数,在分析议题之前,我们首先通论两件关于缺省(默认)构造的事情: 缺省构造函数做什么?缺省构造函数什么时候被调用? 这些答案我们去语言的说明...

《More Effective C++》重点摘要一:基础议题

仔细区别pointers和references。指针和引用有些相似,他们本身都是对存在于某个地方的对象(不是指class)的指示,但是他们有着本质的区别。指针变量存储所指对象的地址,所指的对象可以是n...

More Effective C++议题【一】:指针和引用

> 学习笔记【一】 这个议题作为第一个建议出现在了 More effective ++中, 在一开始,第一件事就是提醒了我们关于指向空值的引用. 即如下代码出现的可能性: char *pc = 0; ...

更高效的C++_More Effective CPP手记一之基础议题

基础议题 M1.指针与引用类型的选用 1.任何时候都不能使用只想控制的引用,引用一经定义,必须指向某个对象,之后不能改变。 2.如果设计中变量不能为空,应该使用引用,而且在使用时不需要对变量进行验...

《More Effective C++》读书笔记-基础议题

一、仔细区别 pointers 和 references1)引用不可以为空(必须指向某个对象),而指针可以为空。 引用带来的好处:不需要检查空引用,也就省了相应的处理代码 指针在使用前则需要判断是...
  • will130
  • will130
  • 2016年04月30日 14:56
  • 192

More Effective C++议题【六】:关于自增、自减操作符的一些讨论

> 学习笔记【六】 这个议题首先讨论的是++和--操作符的重载,为了区分前缀和后缀形式,C++语言规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数。 cla...

More Effectvie C++笔记(二)--不对数组使多态,避免无用的缺省构造函数

ITEM3:不要对数组使用多态 因为数组中各元素内存地址与数组的起始地址的间隔是i*sizeof(一个在数组里的对象)。编译器为了建立正确遍历数组的执行代码,它必须能够确定数组中对象的大小。 由于...
  • houzl
  • houzl
  • 2012年02月03日 14:06
  • 364
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:More Effective C++议题【三】:不要对数组使用多态
举报原因:
原因补充:

(最多只允许输入30个字)