公共继承,相当于属于关系。如CLASS B:public A,表示B就是A,A做到的,B也能做到。
CLASS A
{};
CLASS B:public A
{};
A a;
B b;
a=b;//错误,因为a不一定是b
b=a;//正确,b就是a
public继承下,会出现名字覆盖:B与A若有同名函数,则A中的该函数将被覆盖,包括A中该函数的重载函数。
关于虚函数
含有纯虚函数如: virtual void fun()=0; 的类是抽象类,我们不能创建抽象类的对象。若A中有纯虚函数,则A a=new A是错的,而A a=new B才是正确的。
纯虚函数:
派生类中必须重新声明该函数。(声明一个纯虚函数的目的是为了让派生类只继承接口)
纯虚函数的实现,需要申请才能使用,如下所示
CLASS A
{
virtual void fun()=;
};
void A::fun()
{
//实现
} CLASS B
{
virtual void fun()
{
A::fun();//需要声明使用A的实现
}
}; CLASS C
{
virtual void fun();//可以自己实现
};
void C::fun()
{
//C的fun
}
非纯虚函数:
派生类会继承该函数的声明与实现,可自己实现以覆盖。不安全的原因是:派生类忘记自定义继承过来的函数时,会使用默认的实现(即基类的实现)。而此 默认的函数实现可能不适合此派生类。
非虚函数:
抽象类(只能是抽象类)会强制派生类继承该类的非虚函数,即抽象类的非虚函数将会覆盖所有派生类的同名函数,此做法刚好与非抽象类的继承相反。
总结:
在公共继承下,纯虚函数、非纯虚函数和非虚函数在抽象类的继承当中的作用分别是:只继承接口、继承接口与默认实现、继承接口及强制实现。