一 、C++虚函数
表达一种动态的性质:由基类指针或引用所表示的实际对象来选择所要执行的操作。
二、C++纯虚函数
实声明时“初始化”为0的虚函数。它是一个在基类中说明的虚函数,它在该基类中没有定义(即没有函数体),具体的定义由派生类去完成。
纯虚函数的定义形式是:virtual 返回类型 纯虚函数名(参数列表)=0;
在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
三、抽象类:
包含(至少一个)纯虚函数的类。
由于存在纯虚函数,定义抽象类的对象是毫无意义的,因为对象的操作无法实现。
所以:抽象类只能用作其它类的基类,不能建立抽象类的对象。
抽象类视为抽象和设计的目的而建立的,在有些情况中,类层次结构顶部有好几层都是抽象类。
三、虚析构函数
解决多重继承中delete释放空间时存在的问题。
class A
{
public:
~A(){cout<<"A::~A()called.\n";}
}
class B:public A
{
public:
B(int i){buf=new char[i];}
~B()
{
delete[ ] buf;
cout<<"B::~B() called.\n"
}
private:
char *buf;
}
void main()
{
A *a = new B(15);
delete a;
}
希望结果:B::~B() called.
A::~A()called.
但程序运行结果:
A::~A()called.
四、纯虚析构函数
解决二、三的共同问题
五、虚基类
二义性问题
class B
{
public:
int b;
}
class B1:public B
{
private:
int b1;
}
class B2:public B
{
private:
int b2;
}
class C:public B1,public B2
{
public:
int f();
private:
int d;
}
下面访问出现二义性问题:
C c;
c.b
c.B::b;
下面访问是正确的:
c.B1::b
c.B2::b
虚基类的引入:用于有共同基类的场合。
定义:在继承时以virtual修饰说明基类 。例:class B1::virtual public B。
作用:主用用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题。为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝。
注意:在第一级继承时就要将共同基类设计成虚基类。