閺€鎯版 (0) +1 鐠э拷 (0) +1 闊拷 (0) +1
閺€鎯版閹存劕濮�閺屻儳婀呴弨鎯版>>

正在阅读:『21天精通C++』第三周学习笔记(3-2)『21天精通C++』第三周学习笔记(3-2)

2004-02-14 09:34 出处:PConline 作者:雷神 责任编辑:zwg
第十八天:   在大多数程序中不使用虚函数,就使用静态联编。除非使用了函数指针或是虚函数,否则C/VC++编译器都采用静态联编方式。   静态联编是指在编译时而非运行时确定函数调用。此方法效率高。   动态联编是指在运行时才能确定函数调用。OOP中需要进行动态联编的场合是使用一个指向类家族所有类的指针。只要这个指针指向基类,就能指向任何一个派生类,编译器无法确定指针究竟指向哪个类,直到运行时才能确定。加入Virtual关键字是为了告诉编译器等到运行时在确定哪个函数被调用。基类的还是派生类的函数。   使用Virtual要求动态联编时,VC++在函数调用处插入一个间接指针,不是指向函数首址,而是指向虚拟函数调用地址表(指向函数首址是直接指针)这个表叫做VTABLE(Virtual Table 虚拟表)。在运行时,对象指针触发成员函数在虚拟表中的偏移量调用正确的函数。   纯虚函数不包括任何代码,可以选择给纯虚函数赋0值,从而使编译器不能让用户试图实例化一个包含纯虚函数的基类。   任何包含一个或多个纯虚函数的基类称做抽象基类。不能实例化,成员函数是空的,但可以用它作为它的派生类层次的模式,这样一个基类提供一个所有类家族中类的框架。抽象基类可以列出所有公用数据成员和成员函数,以便派生类继承。 //Filename: 1206.CPP #include #include #include #include int dispMenu(void); void addParts(void); void prParts(void); class inventoryItem{ char partCode[5]; char descrip[20]; int num; float price; public: void addToInv(char P[],char D[],int N,float PR) { num=N; price=PR; strcpy(partCode,P); strcpy(descrip,D); this->toDisk(); } void toDisk(void) { ofstream invOut; invOut.open ("INV.DAT",ios::app); invOut.write ((char *)this,sizeof(*this)); } void getData(void); }; void inventoryItem::getData (void) { ifstream invIn("INV.DAT"); while(invIn) { invIn.read((char *)this,sizeof(*this)); if(invIn.good()) { cout<>ans; return ans; } void addParts(void) { char pc[5]; char de[20]; int q; float pr; inventoryItem part; cin.ignore (); cout<<"名称:"; cin.getline(pc,5); cout<<"说明:"; cin.getline (de,20); cout<<"数量:"; cin>>q; cout<<"价格:"; cin>>pr; part.addToInv (pc,de,q,pr); } void prParts(void) { inventoryItem part; part.getData (); }     『21天精通C++』自学笔记到此就结束了,因是一年多以前的东西了所以不是很完整,当时学的时候只记得虽然书名是21天可雷神共读了三遍用了半年的时间,自以为还没有入门?好象明白了但又什么也不能做,这是怎么回事?雷神一个劲的 @#%$%$@!@@#~¥#。不过以我的性格既然开始了就不放弃,继续学下去,我看的下一本书是『VC技术内幕』。我会把笔记补上有时间的话。
键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
閹靛婧€鐠佸潡妫�閸ョ偛鍩屾い鍫曞劥