C++继承类型:公有、保护、私有、虚拟

原创 2015年11月22日 18:57:34

分类

公有继承(public)、保护继承(protected)、私有继承(private)是常用的三种继承方式,除了这些继承类型外还有一种虚拟继承。

  1. 公有继承(public)

    公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,即基类的公有成员在派生类中还是公有成员,基类的保护成员在派生类中还是保护成员,而基类的私有成员仍然是私有的,不能被派生类及派生类的子类所访问。

  2. 保护继承(protected)

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

  3. 私有继承(private)

    私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,只可以被派生类访问,但是不能被这个派生类的子类所访问。

  4. 虚拟继承(virtual)

    虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类,虚拟继承与变量的可见性关系不大,在此不做讨论。

访问可见性

各种继承的成员对于派生类和全局函数而言,可见性如下,其中“public继承的派生类中”,指的是以public类型从基类继承出的派生类中对于基类中的各种成员的可访问性,“public继承的派生类的对象”指的是以public类型从基类继承出的派生类的对象在全局函数(例如main函数)中对于基类中成员的可访问性。

可见性 public protected private
基类中 public protected private
public继承的派生类中 public protected private
protected继承的派生类中 protected protected 不可见
private继承的派生类中 private private 不可见
public继承的派生类的对象 public 不可见 不可见
protected继承的派生类的对象 不可见 不可见 不可见
private继承的派生类的对象 不可见 不可见 不可见

代码实践出真知

说了这么多你可能都蒙圈了,下面我们写代码来试一试:

class Base       //父类(基类)
{
pub
    int nPublicData;

protected:
    int nProtectedData;

private:
    int nPrivateData;
};

//////////////////////////////////////////////////////////////////////////

class B :public Base      //基类Base的派生类B(共有继承)
{
public:
    void funcDoSomthing()
    {
        int b;

        b = nPublicData;    //ok:基类的公共成员在派生类中为公共成员
        b = nProtectedData; //ok:基类的保护成员在派生类中为保护成员
        b = nPrivateData;   //error:基类中私有成员在派生类中是不可见的
    }
};

//////////////////////////////////////////////////////////////////////////

class C :protected Base   //基类Base的派生类C(保护继承)
{
public:
    void funcDoSomthing()
    {
        int d;

        d = nPublicData;    //ok:基类的公共成员在派生类中为保护成员
        d = nProtectedData; //ok:基类的保护成员在派生类中为保护成员
        d = nPrivateData;   //error:基类中私有成员在派生类中是不可见的
    }
};


//////////////////////////////////////////////////////////////////////////

class D :private Base  //基类Base的派生类D(私有继承)
{
public:
    void funcDoSomthing()
    {
        int c;

        c = nPublicData;     //ok:基类的公共成员在派生类中为私有成员
        c = nProtectedData;  //ok:基类的保护成员在派生类中为私有成员
        c = nPrivateData;    //error:基类中私有成员在派生类中是不可见的  
    }
};

//////////////////////////////////////////////////////////////////////////


int _tmain(int argc, _TCHAR* argv[])
{
    int a;

    B objB;
    a = objB.nPublicData;    //ok:基类的公共成员在派生类中为公共成员,对对象可见
    a = objB.nProtectedData; //error:基类的保护成员在派生类中为保护成员,对对象不可见
    a = objB.nPrivateData;   //error:基类中私有成员在派生类中是不可见的,对对象不可见


    C objC;
    a = objC.nPublicData;    //error:基类的公共成员在派生类中为保护成员,对对象不可见
    a = objC.nProtectedData; //error:基类的保护成员在派生类中为保护成员,对对象不可见
    a = objC.nPrivateData;   //error:基类中私有成员在派生类中是不可见的,对对象不可见


    D objD;
    a = objD.nPublicData;    //error:基类的公共成员在派生类中为私有成员,对对象不可见
    a = objD.nProtectedData; //error:基类的保护成员在派生类中为私有成员,对对象不可见
    a = objD.nPrivateData;   //error:基类中私有成员在派生类中是不可见的,对对象不可见

    return 0;
}

小练习

下面我们来看一个小例子,大家来看看那些变量可以访问

下面我们来看一个小例子,大家来看看那些变量可以访问
class Base
{
public:
    int base1;
protected:
    int base2;
public:
    virtual int funcDoSomething();      //能访问的变量有___________
};

class ProtectedSon : protected Base
{
private:
    int sonValue1;
public:
    int sonValue2;
public:
    int funcDoSomething();              //能访问的变量有___________
};

class PrivateSonSon : private ProtectedSon
{
private:
    int sonsonValue1;
protected:
    int sonsonValue2;
public:
    int funcDoSomething();              //能访问的变量有___________
};

class PublicSonSonSon : private PrivateSonSon
{
private:
    int sonsonsonValue1;
public:
    int funcDoSomething();              //能访问的变量有___________
};

int _tmain(int argc, _TCHAR* argv[])
{
    Base base;
    ProtectedSon son;
    PrivateSonSon sonson;
    PublicSonSonSon sonsonson;

    //各个对象能访问的变量有___________
    return 0;
}

以上就是一个测试理解的小例子,到底答案是什么,“程序猿们”可以自己试一试……

版权声明:本文为博主原创文章,转载请注明出处。更多精彩文章请关注微信公众号:写代码的苏东坡

C++:私有继承

C++:私有继承标签(空格分隔): c++C私有继承 私有继承 初始化基类组件 访问基类方法 访问基类对象 访问基类友元函数 应该使用包含还是继承 保护继承 重新定义访问权限 各种继承方式的比较 公...
  • qq_32583189
  • qq_32583189
  • 2016年09月08日 10:49
  • 1022

C++中基类私有成员会被继承吗

1.派生类间接访问继承私有成员在类的继承中,类的私有成员在派生类中是“不可见“的,这种”不可见“是指在派生类的成员函数中,或者通过派生类的对象(指针,引用)不能直接访问它们。但是,不能直接访问并不代表...
  • K346K346
  • K346K346
  • 2015年11月05日 00:51
  • 5489

c++ 私有继承

None
  • zhongjiekangping
  • zhongjiekangping
  • 2010年09月01日 09:16
  • 6539

c++私有继承有什么用

Private Inheritance C++ has a second means of implementing the has-a relationship: private inherita...
  • hzgdiyer
  • hzgdiyer
  • 2014年04月20日 22:20
  • 1364

C++的私有继承、公有继承和保护继承

#include using namespace std; class Animal { protected: int test; voi...
  • yahohi
  • yahohi
  • 2012年06月28日 17:03
  • 3939

C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制

zz: http://blog.sina.com.cn/s/blog_b35e31b90101b6y7.html 为了防止连接失效,所以直接转过来备份了! 很多同学到现在仍然对访问权限不是很清楚,...
  • temanIU
  • temanIU
  • 2016年02月26日 16:21
  • 1491

公有、私有和受保护成员的特点

公有、私有和受保护成员的特点 公有 @public :公有成员能被继承,也可以被外部函数访问。 私有 @private :私有成员不能被继承,也不能被外部函数访问。 受保护 @protect  :受保...
  • xiyouiOS
  • xiyouiOS
  • 2015年10月18日 12:12
  • 1290

公有、私有、保护总结

公用(public):访问权限最高;除派生类外,外部函数也可以直接访问(无论是成员变量还是成员函数)。 私有(private):访问权限最低;只能是该类内部函数互相调用,派生类、外部函数都不能访问。 ...
  • hyqsong
  • hyqsong
  • 2016年06月13日 19:10
  • 865

C++继承权限和继承方式

C++继承的一般语法为: class 派生类名:[继承方式] 基类名{ 派生类新增加的成员 }; 继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(...
  • chengonghao
  • chengonghao
  • 2016年04月05日 09:05
  • 435

C++之单继承

单继承定义:从一个基类中派生的继承称为单继承。也可以说,单继承的派生类只有一个基类。在单继承中,一个基类可以生成多个派生类,但是每个派生类只有一个基类。       单继承派生类的定义格式:   ...
  • erlian1992
  • erlian1992
  • 2015年03月09日 20:52
  • 1051
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++继承类型:公有、保护、私有、虚拟
举报原因:
原因补充:

(最多只允许输入30个字)