c++访问控制与继承

  最近,决定认真开始记录自己的学习之路。

  c++类的访问控制有public、private和protected。

  首先要分简单的基类和派生类情况,不是很容易混淆与多级继承时的访问控制。自己原先搞得不清楚,也正是因为没有分开二种情况对待。

  在简单的基类和派生类情况中,其访问控制,可以简单总结:

  public:   1、成员函数   2、类对象   3、友元  4、子类成员函数

  private:  1、成员函数  2、友元  

  protected:  1、成员函数  2、友元   3、子类成员函数

  这些基本都清楚,但是之前比较疑惑的就是继承也有分public、private和protected。其实这是对派生类的子类起作用的,并不影响原先基类和派生类的访问控制。

  大致情况就是:

  假设是public继承,那么原先基类的public、private和protected的访问控制对此基类的派生类的子类不变。

  如果是protected继承,则原先基类的public降为protected,并且也是对基类的派生类的子类起作用。

  而private继承,则把原先基类的public、protected都降为private,并且也是对基类的派生类的子类起作用。

  可以把基类比喻为水龙头,而派生类的public继承为原水龙头大小的管(简称大管)、protected继承为中管、private继承为小管,当水龙头水通过水管是,则把原来水龙头的水缩小了,所以只是对派生类子类起作用的。以下通过代码解释一下:

  class Base  
{  
    public: 
        int a1;  
        virtual void test() = 0;  
    protected:
        int a2;  
    private:  
        int a3;  
};  
//------------------------------------------------------------------------------  
class Protected_Class_1:protected Base//保护继承  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在这里被转变为protected  
            a2 = 2;//a2在这里被转变为protected  
            //a3=3;//错误,派生类不能访问基类的私有成员  
        }  
};  
class Protected_Class_2:public Protected_Class_1//以public方式继承Protected_Class_1类  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在这里仍然保持为a1在这里被转变为protected  
            a2 = 2;//a2在这里仍然保持为a1在这里被转变为protected  
            //a3=3;//错误,由于Base类成员为私有的,即使是上级父类是保护继承,也不能改变Base类成员的控制类型  
        }  
};  
//------------------------------------------------------------------------------  
class Private_Class_1:private Base//私有继承  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在这里被转变为private  
            a2 = 2;//a2在这里被转变为private  
            //a3=3;//错误,基类私有成员一样是不可访问的  
        }  
};  
class Private_Class_2:public Private_Class_1//以public方式继承Private_Class_1类  
{  
    public:  
        void test()  
        {  
            //a1=1;//错误,由于基类Private_Class_1为私有继承,a1已经转变为private  
            //a2=2;//错误,由于基类Private_Class_1为私有继承,a1已经转变为private  
            //a3=3;//错误,由于Base类成员为私有的,Private_Class_1类也为私有继承  
        }  
};  
//------------------------------------------------------------------------------  
class Public_Class_1:public Base//共有继承有区别与其它方式的继承,继承后的各成员不会其改变控制方式  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1仍然保持public  
            a2 = 2;//a2仍然保持protected  
            //a3=3;//错误,派生类不能操作基类的私有成员  
        }  
};  
class Public_Class_2:public Public_Class_1//以public方式继承Public_Class_1类  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1仍然保持public  
            a2 = 2;//a2仍然保持protected  
            //a3=3;//错误,由于Base类成员为私有成员,即使是上级父类是公有继承,也不能改变Base类成员的控制类型  
        }  
};

  

时间: 2024-09-29 04:18:42

c++访问控制与继承的相关文章

C++类访问控制及继承

一.C++类的访问控制有三类:public,protected和private. 类访问控制符 类成员可被哪些对象访问 public 1.类的成员函数.2.类对象.3.友元.4.子类成员函数 protected 1.类的成员函数.2.友元.3.子类成员函数 private 1.类的成员函数.2.友元 二.C++类的继承 继承方式也有三种:public,protected和private. 继承之后,基类成员的可访问性会发生变化,如下表: public继承 基类 public protected

【足迹C++primer】53、访问控制和继承

访问控制和继承 public: 公有类型 private: 私有类型 protected: 保护类型 当一个类的成员定义为public,就能够在类外访问,包括它的派生类. 当一个成员定义为private,它仅能在类内访问,不能被它的派生类访问. 当一个成员定义为proteced,它仅能在类内访问,但是能被它的派生类访问. 当一个成员没有指定访问说明符时,默认为private. 派生类成员或友元可以访问受保护的成员 但只有只有通过派生类对象来访问. class Base { protected:

OOP2(虚函数/抽象基类/访问控制与继承)

通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定应该调用哪个版本的函数.被调用的函数是与之绑定到指针或引用上的对象的动态类型相匹配的那一个 注意:动态绑定只有当我们通过指针或引用调用虚函数时才会发生.当我们通过一个具有普通类型(非引用非指针)的表达式调用虚函数时,在编译时就会将调用

面向对象程序设计——抽象基类,访问控制与继承,继承中的类作用域,拷贝函数与拷贝控制

一.抽象基类 1)纯虚函数 和普通的虚函数不同,一个纯虚函数无须定义.我们通过在函数体的位置(即在声明语句的分号之前)书写=0就可以将一个虚函数说明为纯虚函数.其中,=0只能出现在类内部的虚函数声明语句处. 值得注意的是,我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部.也就是说,我们不能在类的内部为一个=0的函数提供函数体. 2)含有纯虚函数的类是抽象基类 含有(或者未经覆盖直接继承)纯虚函数的类是抽象基类.抽象基类负责定义接口,而后续的其他类可以覆盖该接口.我们不能直接创建一个抽象

面向对象(访问控制、继承、重载)

=begin Public 方法: Public 方法可被任意对象调用.默认情况下,方法都是 public 的,initialize 方法总是 private 的. Protected 方法: Protected 方法只能被类及其子类的对象调用.访问也只能在类及其子类内部进行. Private 方法: Private 方法不能被明确的接受者调用,其接受者只能是self,所以只能在当前对象的上下文中被调用 =end class Box # 构造器方法 def initialize(w,h) @wi

[C++]访问控制与继承(public,protect,private) 有时间再整理!!!

http://www.cnblogs.com/chio/archive/2007/06/11/779408.html http://www.cnblogs.com/SelaSelah/archive/2012/08/12/2634256.html http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/23/2514964.html http://bbs.csdn.net/topics/380193036 http://www.cnblogs.c

访问控制与继承

每个类分别控制自己的成员初始化过程,与之类似,每个类还分别控制着成员对于派生类来说是否可访问. 受保护的成员 如前所述,一个类使用protected关键字来声明那些它希望与派生类分享但是不想被其他公共访问使用的成员.protected说明符可以看做是public和private中和后的产物:

【C/C++】继承与访问控制

常见问题 Q1. 类child从类parent公有派生,则类child可以访问类parent中的哪些成员? A. public成员 B. private成员 C. protected成员 D. 数据成员 Q2. 类child从类parent公有派生,若有"child c;",那么c可以访问类parent中的哪些成员? A. public成员 B. private成员 C. protected成员 D. 都不能访问 Q3. 类child从类parent私有派生,则类child可以访问类p

(继承)virtual与访问控制

之前只注意过访问控制与继承的关系,这边不多说,今天看到代码看到virtual放在private里,并且还有派生类没有override public里的virtual,此时调用时啥情况了,这边有点晕,看下面代码 首先最基本的多态代码 #include <iostream> #include <string> using namespace std; class animal { public: //animal(); //~animal(); virtual void speakou