抽象类不能实例化对象!
为了让一个类成为抽象类,至少必须有一个纯虚函数。包含至少一个纯虚函数的类视为抽象类!
classA
{
public:
virtual void lock(void)=0;
virtual void unlock(void)=0;
virtual ~A(void);
}
//将函数lock()和unlock()初始化为0使它们成为纯虚函数,没有0这个初使化器,它们仅仅是虚函数。
如果子类是一个非抽象类的的话,必须重写父抽象类的所有抽象方法,如果子类是一个抽象类的话,可以重写父抽象类的抽象方法,也可以继承父抽象类的抽象方法~
虚基类
class x1:virtual public x //virtual也可以写在public后面
{
//……
};
虚基类可以解决二义性的问题
其实说白了就是解决多重多级继承造成的二义性问题。例如有基类B,从B派生出C和D,然后类F又同时继承了C和D,现在类F的一个对象里面包含了两个基类B的对象,如果F访问自己的从基类B那里继承过来的的数据成员或者函数成员那么编译器就不知道你指的到底是从C那里继承过来的B对象呢还是从D那里继承过来的B对象。
于是虚基类诞生了,将C和D的继承方式改为虚继承,那么F访问自己从B那里继承过来的成员就不会有二义性问题了,也就是将F对象里的B对象统一为一个,只有一个基类B对象,下面是一段代码说明了对虚基类的使用。
#include <iostream>
using namespace std;
class A
{
public:
int i;
void showa(){cout<<"i="<<i<<endl;}
};
class B:virtual public A //此处采用虚继承
{
public:
int j;
};
class C:virtual public A //此处采用虚继承
{
public:
int k;
};
class D:public B,public C//调用析构函数时先调用虚基类的构造函数,然后挨个最后调用基类的析构函数,构造函数反过来
{
public:
int m;
};
int main()
{
A a;
B b;
C c;
a.i=1;
a.showa();
b.i=2;
b.showa();
c.i=3;
c.showa();
D d;
d.i=4;
d.showa();
//cout << "Hello world!" << endl;
return 0;
}
从这个代码我们可以看出B,C,D从A那里继承过来了i这个变量并且它们之间不会有任何影响,如果B和C不是虚继承方式的,那么d.i=4;就不能编译通过了。
创建派生类的对象时:先调用基类构造函数,对象成员构造函数(单选上的,并不太懂),派生类本身构造函数.