1、虚函数
使用虚函数 + 继承 + 基类指针 来实现多态
2、虚析构
如果一个类用作基类,我们通常需要virtual来修饰它的析构函数,这点很重要。如果基类的析构函数不是虚析构,当我们用delete来释放基类指针(它其实指向的是派生类的对象实例)占用的内存的时候,只有基类的析构函数被调用,而派生类的析构函数不会被调用,这就可能引起内存泄露。如果基类的析构函数是虚析构,那么在delete基类指针时,继承树上的析构函数会被自低向上依次调用,即最底层派生类的析构函数会被首先调用,然后一层一层向上直到该指针声明的类型
3、虚基类(Virtual base class)-其实就是虚继承
为解决多重继承时的二义性提出来的,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员,这种现象是人们不希望出现的,所以C++使用虚基类来使得在继承间接共同基类时只保留一份成员。使用方法:
class A{…}; //声明基类A
class B :virtual public A {…}; //声明类B是类A的公用派生类,A是B的虚基类
class C :virtual public A{…}; //声明类C是类A的公用派生类,A是C的虚基类
虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。
声明虚基类的一般形式为
class 派生类名: virtual 继承方式
基类名
经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次。
需要注意: 为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。如:
class A{…}; //声明基类A
class B :virtual public A {…}; //声明类B是类A的公用派生类,A是B的虚基类
class C :virtual public A{…}; //声明类C是类A的公用派生类,A是C的虚基类
class D :public A{…};
class E :public B,C,D{…};
派生类B和C中将类A声明为虚基类,而派生类D中没有将类A声明为虚基类,则在派生类E中,虽然从类B和C路径派生的部分只保留一份基类成员,但从类D路径派生的部分还保留一份基类成员。
4、纯虚函数
含有纯虚函数的类叫做抽象类。纯虚函数如下:
void virtual foo() = 0;
抽象类:抽象类只能作为基类来派生新类,不能声明抽象类的对象。(既然都是一个抽象概念了,纯虚函数没有具体实现方法,故不能创造该类的实际的对象)
但是可以声明指向抽象类的指针变量或引用变量,通过指针或引用,就可以指向并访问派生类对象,进而访问派生类的成员。(体现了多态性)
884



被折叠的 条评论
为什么被折叠?



