第十八天:
在大多数程序中不使用虚函数,就使用静态联编。除非使用了函数指针或是虚函数,否则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技术内幕』。我会把笔记补上有时间的话。
|