摘要:
class B { public: void mf(); ... }; class D : public B {...}; D x; 如果一下行为: B* pB = &x; pB->mf(); 异于以下行为: D* pD = &x; pD->mf(); 你可能相当惊讶。两者的行为确实应该相同,但是如果mf... 阅读全文
摘要:
假设你整在写一个视频游戏软件,由于不同的人物可能以不同的方式计算它们的健康指数,将healthValue声明为virtual似乎再明白不过的做法:class GameCharacter { public: virtual int healthValue()const; ... };由于这个设计如此明显,你可能没有认真考虑其他替代方案。为了帮助你跳脱面向对象设计路上的常轨,让我们考虑其他一些解法:藉由Non-virtual interface手法实现Template Method模式有个思想流派主张virtual函数应该几乎总是private。他们建议,较好的设计是保留healthValue.. 阅读全文
摘要:
身为class设计者,有时候你希望derived class只继承成员函数的接口(也就是声明):有时候你又希望derived class同时继承函数的 接口和实现,但又希望能够覆写(override)它们所继承的实现:又有时候你希望derived class同时继承函数的接口与实现,并且不允许覆写任何东西。 让我们考虑一个展现绘图程序中各种几何形状的class继承体系: cla... 阅读全文
摘要:
这个题材其实和继承无关,而是和作用域(scopes)有关。 int x; void someFunc() { double x; std::cin >> x; } 这个指涉的是local变量x,而不是global变量x,因为内存作用域会的名称遮掩外围作用域的名称。 当编译器处于someFunc的作用域内并遭遇名称x... 阅读全文
摘要:
如果你令class D以public形式继承class B,你便是告诉c++编译器,每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。 B比D表现出更一般化的概念,D比B更特殊化的概念。任何函数如果期望获得一个类型为B(或pointer to B或reference-to-B)的实参,都也愿意接受一个D对象(或pointer-to-D或reference-to-D)。这个论点只有... 阅读全文
摘要:
假设你对c++程序的某个class实现文件做了些轻微改变,修改的不是接口,而是实现,而且只改private成分。 然后重新建置这个程序,并预计只花数秒就好,当按下“Build”或键入make,会大吃一惊,因为你意识到整个世界都被重新编译和链接了! 问题是在c++并没有把“将接口从实现中分离”做得很好。class 的定义式不只详细叙述了class接口,还包括十足的实现细目: cl... 阅读全文
摘要:
inline函数,可以调用它们而又不需蒙受函数调用所招致的额外开销 当你inline某个函数,或许编译器就因此又能力对它(函数本体)执行语境相关最优化。 然而,inline函数背后的整体观念是,将“对此函数的每一个调用”都已函数本体替换之,这样做可能增加你的目标码(object code)大小。在内存有限的机器上,过度inline会造成程序体积太大,导致换页行为,降低缓存的命中率... 阅读全文
摘要:
有个class用来表现夹带背景图案的GUI菜单单,这个class用于多线程环境: class PrettyMenu{ public: ... void changeBackground(std::istream& imgSrc); ... private: Mutex mutex; ... 阅读全文
摘要:
假设程序涉及矩形。为了让Rectangle对象尽可能小,可能把定义矩形的点放在一个辅助的struct内再让Rectangle去指它: class Point{ public: Point(int x, int y); ... void setX(int newVal); void setY(int newVal... 阅读全文
摘要:
转型(casts)破坏了类型系统(type system)。可能导致任何类型的麻烦。c++提供四种新式转型const_cast<T>(expression) //cast away the constnessdynamic_cast<T>(expression) //safe downcasting安全向下转型reinterpret_cast<T>(expression)//意图执行低级转型,实际动作(及结果)可能取决于编译器,这也表示它不可移植;低级代码以外很少见static_cast<T>(expression)//用来强迫隐式转换(impl 阅读全文