上一页 1 ··· 3 4 5 6 7 8 9 10 11 下一页
  2013年6月5日
摘要: (1)显示接口和运行期多态在一般的类的实现和使用中,对象的类型是明确的,调用的函数也是在源代码中明确声明的,如果是virtual函数,具体要调用的哪个类的函数会在运行时决定,即运行期多态,如下代码: 1 class Widget{ 2 public: 3 Widget(); 4 virtual ~Widget(); 5 virtual size_t size() const; 6 virtual void normalize(); 7 void swap(Widget& other); 8 ... 9 };10 11 12 void doProcessing(Widget& w 阅读全文
posted @ 2013-06-05 22:37 Sophia-呵呵小猪 阅读(959) 评论(0) 推荐(0) 编辑
摘要: C++中,所谓的多继承是指一个派生类可以有多个基类,这样就可能带来以下几方面的问题:(1)多个基类中存在相同名称时如果一个派生类继承的多个基类中包含有相同名称的函数时,有可能会产生调用不明确,即发生歧义,比如如下代码: 1 class BorrowableItem 2 { 3 public: 4 void checkOut(); 5 }; 6 7 class ElectronicGadget 8 { 9 public:10 bool checkOut() const;11 };12 13 class MP3Player : public BorrowableItem, public Elec. 阅读全文
posted @ 2013-06-05 21:08 Sophia-呵呵小猪 阅读(280) 评论(0) 推荐(0) 编辑
摘要: C++中派生类从基类继承之后,non-virtual函数不应被重新定义,因为它会导致派生类对象的行为不一致性,也违背了public的"is a"继承关系。除了non-virtual函数不该被派生类重新定义外,基类virtual函数中的缺省参数值也不应该被派生类重新定义,其主要原因是virtual函数是动态绑定,而缺省参数值却是静态绑定。(1)对象的动态类型和静态类型对一个对象,其静态类型指其被声明时的类型,其动态类型则是指其所指的具体对象的类型。例如下面的继承体系: 1 class Shape 2 { 3 public: 4 enum ShapeColor { Green, 阅读全文
posted @ 2013-06-05 11:32 Sophia-呵呵小猪 阅读(510) 评论(0) 推荐(0) 编辑
  2013年6月4日
摘要: 在C++中,派生类不应该对从基类继承的non-virtual函数重新定义,首先看下面一段代码: 1 class B 2 { 3 public: 4 void mf(); 5 ... 6 }; 7 8 class D:public B 9 {10 ...11 };12 13 D x;14 B* pb = &x;15 pb->mf();16 17 D* pd = &x;18 pd->mf();上面的代码中第15行和第18行调用的函数都是mf,且pb和pd都是指向对象D的,那么这两次调用是否是同一个函数呢?答案是不一定,因为如果D中重新定义了mf函数,那么15行调用的是B 阅读全文
posted @ 2013-06-04 22:05 Sophia-呵呵小猪 阅读(167) 评论(0) 推荐(0) 编辑
摘要: C++的纯虚函数导致声明它的类成为抽象类,即不可以实例化,派生于这个基类的类必须重新声明所有的纯虚函数。通常纯虚函数不在基类中定义,所以派生类实际上是继承了这些纯虚函数形式的接口,它告诉派生类:你必须实现这些纯虚函数的接口,但是具体的实现方式我不干涉,由你决定!例如在绘图基类Shape中有一个纯虚函数为draw,对于正方形、圆形等要求必须有一个对应的draw函数,但具体的draw由具体的派生类决定,基类函数只是告诉你必须声明和定义这个draw函数。当然,纯虚函数在基类中也是可以定义的,但对它的调用需要由类名进行指定,例如:1 Shape* re = new Rectangle;2 re-> 阅读全文
posted @ 2013-06-04 20:26 Sophia-呵呵小猪 阅读(863) 评论(0) 推荐(0) 编辑
摘要: 1)public继承中解决名称遮掩的方法——引入using声明式所谓名称遮掩是指如果变量或函数的名称相同时,局部的会遮掩外围的,派生类会遮掩基类的,如: 1 class Base 2 { 3 private: 4 int x; 5 public: 6 virtual void mf1() = 0; 7 virtual void mf1(int); 8 virtual void mf2(); 9 void mf3();10 void mf3(double);11 ...12 };13 14 class Derived : public Base15 {1... 阅读全文
posted @ 2013-06-04 16:59 Sophia-呵呵小猪 阅读(362) 评论(0) 推荐(0) 编辑
摘要: 1)文件间存在的编译依存关系在C++中,如果没有将接口和实现分离,那么在修改起一个成分,就有可能导致编译时许多文件的重新编译,如定义类如下: 1 class Person 2 { 3 public: 4 Person(const string& name, const Date& birthday, const Address& addr); 5 string name() const; 6 string birthDate() const; 7 string address() const; 8 private: 9 string theN... 阅读全文
posted @ 2013-06-04 14:46 Sophia-呵呵小猪 阅读(463) 评论(0) 推荐(0) 编辑
  2013年6月3日
摘要: inline函数的本质是对函数的每一个调用都以函数本体替换它,它的优点主要有:1)没有一般函数的调用成本;2)方便编译器进行优化:编译器最优化机制通常被设计用来浓缩那些“不被函数调用”的代码,所以当你inline某个函数,编译器就有能力对函数本体执行语境相关最优化,大部分编译器不会对着一个“outlined函数调用”动作执行如此之最优化。然而,对于inline,还有下面几个问题是需要注意的:1)由于inline真正的操作时用函数本体代替调用的代码,因此容易造成程序体积过大,这样一来,代码膨胀可能造成额外的换页行为,降低指令高速缓存装置的击中率,引发效率损失;反之,如果函数的本体很小,编译器针对 阅读全文
posted @ 2013-06-03 22:26 Sophia-呵呵小猪 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 定义类PrettyMenu如下: 1 class PrettyMenu 2 { 3 public: 4 ... 5 void changeBackground(istream& imgSrc); 6 ... 7 private: 8 Mutex mutex; 9 Image* bgImage;10 int imageChanges;11 };View Code 成员函数changeBackground的实现如下:1 void PrettyMenu::changeBackground(std::istream& ... 阅读全文
posted @ 2013-06-03 20:43 Sophia-呵呵小猪 阅读(355) 评论(0) 推荐(0) 编辑
摘要: 定义下面的类和结构: 1 class Point 2 { 3 public: 4 Point(int x, int y); 5 ... 6 void setX(int newVal); 7 void setY(int newVal); 8 }; 9 struct RectData10 {11 Point ulhc;12 Point lrhc;13 };14 class Rectangle15 {16 ...17 private:18 std::tr1::shared_ptr<RectData> pData; 19 ... 阅读全文
posted @ 2013-06-03 16:56 Sophia-呵呵小猪 阅读(481) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 下一页