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;
}

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

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

相关文章推荐

对虚拟继承类型求sizeof

#include #include #include #include #include #include #include #include using namespace std;...

c++ 虚继承与继承的差异

前面一篇文章,说明了在C++ 虚继承对基类构造函数调用顺序的影响。经过仔细推敲,发现没有彻底说清楚虚继承与普通继承之间的关系。所以用下面的文字再说明一下。 首先,重复一下虚拟继承与普通继承的区别...
  • dqjyong
  • dqjyong
  • 2012年09月28日 20:51
  • 25403

C++继承和菱形继承中的虚继承

(1)C++继承概念: C++继承分为公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。在C++语言中,一个派生类可以从一个基类派生,也可以从多...

fprintf和fwrite的一点“怪异”现象

我们先来看一个简单的程序: #include int main() { int a = 0; int len = sizeof(a); // 相当于在log1中以文本文件方式输入0 ...
  • stpeace
  • stpeace
  • 2013年06月22日 22:14
  • 1521

基类的指针指向派生类的对象

说明:只要基类的成员函数是虚函数,派生类的同名函数不管有没有显示声明virtual都是虚函数。 #include "stdafx.h" #include "iostream" using namesp...

C++继承:公有,私有,保护

公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员...

C++公有,私有,保护继承

公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,...
  • PZ0605
  • PZ0605
  • 2015年01月22日 14:22
  • 570

C++继承:公有,私有,保护

公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生...

C++基类和派生类私有、保护、公有成员访问控制以及动态绑定、三种继承

1.类的一个特征就是封装,public和private作用就是实现这一目的。所以: 用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元...

C++继承:公有 私有 保护

公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生...
  • Raid_9
  • Raid_9
  • 2014年08月11日 11:49
  • 189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++继承类型:公有、保护、私有、虚拟
举报原因:
原因补充:

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