纯虚函数:纯虚函数是指被标明为不具体实现的虚拟成员函数。它用于这样的情况:定义一个基类时,会遇到无法定义基类中虚函数的具体实现,其实现依赖于不同的派生类。
定义纯虚函数的一般格式为:virtual 返回类型 函数名(形参列表)=0;“=0“表明程序员将不定义该函数,函数申明是为派生类保留一个位置,”=0“本质上是将指向函数体的指针定义为NULL。
抽象类:
含有纯虚函数的基类是不能用来定义对象的,纯虚函数没有实现部分,不能产生对象,所以含有纯虚函数的类是抽象类。
抽象类是不能定义对象的,在实际中为了强调一个类是抽象类可将该类的构造函数说明为保护的访问控制权限。
抽象类只能作为基类来使用,其纯虚函数的实现由派生类来给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类给出了基类中纯虚函数的实现,则该派生类就不再是抽象类了,而是一个可以建立对象的具体类了。
如下代码所示:
class Shapes
{
public:
virtual void disp() const = 0;//纯虚函数
};
class Square
{
private:
float length;
public:
virtual void disp() const//对抽象类中虚函数的具体实现
{
cout << length * length << endl;
}
};
抽象类的规定:
- 抽象类只能用作其他类的基类,不能建立抽象类对象。
- 抽象类不能用作参数类型、函数返回类型或显式转换的类型。
- 可以定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。
动态联编:
联编是计算机程序自身彼此关联的过程,是把一个标识符名和一个存储地址关联在一起的过程,也是把一条消息和一个对象的操作相结合的过程。
如果使用基类指针或引用指明派生类对象并使用该指针调用(”->“)虚函数,则程序动态地选择该派生类的虚函数,称为动态联编(滞后联编)。
如果使用对象和点成员运算符”.“引用特定的一个对象来调用虚函数,则被调用的虚函数在编译时是确定的(称为静态联编)。
下面看一段代码并且分析其运行结果:
class Object
{
public:
virtual void Print(int a = 10)
{
cout << "Object Printf a:" << a << endl;
}
};
class Base :public Object
{
private:
virtual void Print(int b = 100)
{
cout << "Base Printf b" << b << endl;
}
};
int main()
{
Base base1;
Object* op = &base1;
op->Print();
return 0;
}
运行结果如下所示:
结果的缘由如下图所示: