浅谈C++中继承

继承在C++中是一个关键核心特性。继承,往往被人们认为是对类的数据和功能的扩展。而我的理解,它的核心任务则是为了实现动态接口,或者说是完成覆盖功能的。因为仅仅是完成对类的扩展,我们还有其他的方法如组合等,这样还不会引起“类爆炸”。也许是经常这么用,所以理解有些偏执,各位轻拍~下面看一个例子:

#include <iostream>
using namespace std;

class Ca{

public:    
     virtual void func(){cout <<"This is A class"<<endl;}

           void func2(){cout<<"func2 from A"<<endl;}

};

class Cb:public Ca{

public:   
     virtual void func(){cout<<"This is B class"<<endl;}

          void func2(){cout<<"func2 from B"<<endl;}

};

int main(){

    Ca *pa=new Ca();

    pa->func();                    //调用类Ca的func函数

    Cb *pb=(Cb*) pa;          //将指向Ca类的指针pa进行类型转换,然后赋值给Cb类指针pb,这时pb指向的地址和pa的完全一样

    pb->func();                   //故调用Ca中func

    pb->func2();                 //因pb是Cb类型的指针,虽然他动态晚绑定的是pa的地址,但是由于func2是一般函数,无法覆盖,自己完全可以准确无误的找到自己的func2
 
    delete pa,pb;                //将pa,pb指向的内容清理,但指针本身还在,这就是我们说的野指针或者叫做悬浮指针,可以继续使用

    pa=new Cb();               //动态绑定B类地址给pa

    pb=(Cb*)pa;                //同理,类型转换+赋值

    pa->func();                 //调用Cb的func

    pb->func();                 //同上

    pa->func2();               //调用pa自己的func2这一普通函数,pa是Ca类的实例指针
    system("pause");
    return 0;

}

ok,上面说完继承的一个核心作用,就进一步到集中常见的继承方式上来了,这里尽量简明的举例说明,可能不全面,但尽量易懂:

常用的三种继承方式:公有继承(public)、私有继承(private)、保护继承(protected)。

1. 公有继承(public):

简而言之,父类的公有和保护成员在子类中保持性质不变,可以被子类和子类对象正常访问,而私有成员不可被子类及对象访问。

2. 私有继承(private):

父类的公有和保护成员变成子类的private成员,在子类中可以被访问,但子类对象不可访问他们(即对象不可见)。而父类私有成员都不可用。

3. 保护继承(protected)

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,但子类的实例对象不可访问他们,基类的私有成员仍然是私有的。

#include<iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////
class A       //父类
{
private:
    int m_privateA;
protected:
    int m_protectA;
public:
    int m_publicA;
};
//////////////////////////////////////////////////////////////////////////
class B :public A      //基类A的派生类B(共有继承)
{
public:
    void funct()
    {
        int b;
        b=m_privateA;   //error:基类中私有成员在派生类中是不可见的
        b=m_protectA; //ok:基类的保护成员在派生类中为保护成员
        b=m_publicA;    //ok:基类的公共成员在派生类中为公共成员
    }
};
//////////////////////////////////////////////////////////////////////////
class C :private //基类A的派生类C(私有继承)
{
public:
    void funct()
    {
        int c;
        c=m_privateA;    //error:基类中私有成员在派生类中是不可见的
        c=m_protectA;  //ok:基类的保护成员在派生类中为私有成员
        c=m_publicA;     //ok:基类的公共成员在派生类中为私有成员
    }
};
//////////////////////////////////////////////////////////////////////////
class D :protected A   //基类A的派生类D(保护继承)
{
public:
    void funct()
    {
        int d;
        d=m_privateA;   //error:基类中私有成员在派生类中是不可见的
        d=m_protectA; //ok:基类的保护成员在派生类中为保护成员
        d=m_publicA;    //ok:基类的公共成员在派生类中为保护成员
    }
};
//////////////////////////////////////////////////////////////////////////
int main()
{
    int a;
 
    B objB;
    a=objB.m_privateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见
    a=objB.m_protectA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
    a=objB.m_publicA;    //ok:基类的公共成员在派生类中为公共成员,对对象可见
 
    C objC;
    a=objC.m_privateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见
    a=objC.m_protectA; //error:基类的保护成员在派生类中为私有成员,对对象不可见
    a=objC.m_publicA;    //error:基类的公共成员在派生类中为私有成员,对对象不可见
 
    D objD;
    a=objD.m_privateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见
    a=objD.m_protectA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
    a=objD.m_publicA;    //error:基类的公共成员在派生类中为保护成员,对对象不可见
 
    return 0;
}

ok,上面关于继承的东东就写到这,其中有在网上参考,在此表示感谢。

posted @ 2013-03-31 17:12  追风筝的小蜗牛  阅读(103)  评论(0)    收藏  举报