C++非继承时函数成员访问属性和类继承过程中的访问控制

目录
  • 一、非继承时public、protected和private成员的访问属性
  • 二、C++类继承过程中访问控制

一、非继承时public、protected和private成员的访问属性

C++中保护成员使用protected进行声明,那么protected、public和private三者有什么区别呢?

先说结论:非继承时,protected成员和private成员没有任何区别,都是类内部可以直接访问它们、类外部的类对象不可访问它们、类内部的类对象可以访问它们;相比之下,public成员在类内部、类外部的类对象、类内部的类对象中都是可直接访问的。

下面定 义的Bird类:

class Bird {
public:
    Bird() { 
        eat();   // 正确,类内可以访问保护成员
    };
protected:
    void eat() { printf("Bird eating \n"); }
};

上述代码表明,类内是可以直接访问protected成员的,下面来看类外部的类对象:

int main() {
    Bird bird();
    bird.eat();  // 错误,protected成员类外部对象不可访问
}

上述代码表明,类外部类对象是不能直接访问protected成员的。

所以说,非继承时protected成员和private成员没有差别。它们真正展示出差异是在“基类和子类的继承”时,具体分析留在后面日志。

重点:上述分析强调了“类外部的类对象和类内部的类对象”是不同的(类内部类对象是指:Bird类的复制构造函数就使用Bird类对象的引用可以访问其私有成员和保护成员)。因此,才要特殊指明“类外部的类对象不能访问protected和private成员,类内部的类对象可以访问其protected和private成员”。

二、C++类继承过程中访问控制

在子类继承父类的过程中,子类可以指定以何种方式继承父类:public继承、protected继承和private继承,这个过程可以称为“访问控制”。

在学习访问控制之前,需要知道类含有三种成员public成员、protected成员、private成员。在非继承的情况下,这三种成员的访问属性是不同的:public成员在类内部和外部均可被直接访问;protected和private成员均可以被类内部和类内部的类对象访问,均不能被类外部的类对象访问。为了便于自己记忆,称这个规则为“非继承时三种成员的访问法则”
此知识点的复杂性在于继承方式有三种,每种继承方式又对应三种成员,所以一共是九种情况。

为此,采用表格形式记录如下:

上表中“子类吸收后”表示父类成员在子类中是何种身份(身份指:publicprotectedprivate),也就是说不同的继承类型使得父类成员在子类中的身份不同。

比如:在protected继承类型中,父类中的public成员对应在子类中为protected成员,此时子类内部(指成员函数和子类对象)可以访问该protected成员,但是子类外部的子类对象无法访问该成员。也就是说,通过protected类型的继承,该成员从父类中的public成员变为子类中的protected成员。

下面是public继承的例子,其中父类为Animal,子类为Duck:

class Animal {
public:
    Animal(int age_) { age = age_; printf("Init Animal \n"); 
    }

    void eat() { printf("Animal eating! \n"); }
protected:
    void run() { printf("Animal Running! \n"); }
private:
    int age=0;
    void showAge() { printf("Age is %d", age); }
};

父类Animal中分别定义了public类型的eat()函数、protected类型的run()函数、private类型的showAge()函数。子类可以通过选择不同的继承方式,改变这几个函数在子类中的访问属性:

class Duck:public Animal {
public:
    Duck(int age_) :Animal(age_) { 
        printf("init Duck! \n");
        run(); // 正确,子类内部可以访问基类public成员
        eat(); // 正确,子类内部可以访问基类protected成员
        showAge(); // 错误,子类内部不可访问基类的private成员
    };
};

总结:

按照自己目前的理解,不管继承方式为publicprotectedprivate三种中的哪一个,父类的private成员对应到子类中均“不可直接访问”。此外,子类不继承父类的构造函数和析构函数。

疑惑:

书中所说的“不可直接访问”,目前自己并不知道如何间接访问,猜测可能是采用 “get” 和 “set” 方式进行间接访问。

到此这篇关于C++非继承时函数成员访问属性和类继承过程中的访问控制的文章就介绍到这了,更多相关C++非继承和类继承访问内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++数据结构继承的概念与菱形继承及虚拟继承和组合

    目录 继承的概念 继承的定义 基类和派生类对象之间的赋值转换 继承中的作用域 派生类的默认成员函数 继承中的两个小细节

  • C++的继承特性你了解吗

    目录 导语: 继承作用 继承的结果 继承方式 子类构造 赋值兼容规则/向上转换/内存切片 多继承 虚拟继承 总结 导语: C++是对C语言的优化和改进,C++之所以优秀的点在于它的特性:抽象.封装.继承和多态. 本章总结继承的规则和特性,都是干货,与读者共同学习. 继承作用 代码的复用 子类继承父类,可以理解为,将父类的代码拷贝一份到子类中,达到子类可以调用父类方法的目的. 那为什么是可以理解而不是就是呢? 是因为有几个东西是不可以拷贝的,比如,父类的拷贝和析构方法,友元和静态成员. 友元关系是

  • C++中菱形继承的解释与处理详解

    封装,继承,多态.这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题——菱形继承. 派生类继承父类,同时也会继承父类中的所有成员副本,但如果在继承时一个基类同时被两个子类继承,然后一个新类又分别由上面的两个子类派生出来.这样从某种程度来说就形成了C++中的菱形继承,也可以叫做钻石继承,具体的继承形式如下图所示: 在上面的类图说,Left和Right分别派生子Top,但是Bottom又分别继承了Left和Right.继承关系也可以画成下面的方式,这样就可以更好的理解设

  • C++ 超详细梳理继承的概念与使用

    目录 继承的概念及定义 继承的概念 继承定义 定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 菱形继承 虚拟继承解决数据冗余和二义性的原理 继承的总结和反思 继承的概念及定义 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体

  • C++的继承和派生你了解吗

    目录 继承的写法 继承实质与权限问题​ 总结 继承的写法 //父类 基类 class parent { }; //子类 派生类 //公有继承 class soon1:public parent { public: protected: }; //保护继承 class son2:protected parent { public: protected: }; //私有继承 class son3:private parent { public: protected: }; //继承和派生 //继承:

  • C++ 多继承详情介绍

    C++支持多继承,即允许一个类同时继承多个类. 关于多继承,一直以来争议不断,有一部分人认为多继承会带来大量的问题,为了解决这些问题会使得语言本身变得非常复杂,因此应当避免.另外一派认为多继承在某些场景下可以起到非常关键的作用,应当予以支持. 关于多重继承是好是坏,这是一个非常复杂的问题,网上历来争议不断.因此不过多阐述,感兴趣的同学可以查阅一下相关资料.仅仅从实际支持来看,目前市面上大部分的语言包括Java仅支持单继承,只有C++等少数语言支持多继承.这和C++的理念也有关,即认定不能通过减少

  • 关于C++继承你可能会忽视的点

    目录 前言 一.什么是继承 二.基类与派生类的赋值转换 2.1天然支持的理解 三.继承当中的作用域 四.派生类的默认构造成员函数 4.0什么时候需要写6个默认成员函数 4.1构造函数 4.2拷贝构造 4.3赋值重载 五.菱形继承和菱形虚拟继承 5.1菱形继承 六.继承的总结 继承和组合 总结 前言 继承是使代码复用的一种重要的手段,我们在C语言时期写的swap函数逻辑,通常会单独写出来再给其他函数复用,这个继承可以理解成是类级别的一个复用,它允许我们在原有类的基础上进行扩展,增加新的功能. 一.

  • C++类的继承和派生及指针安全引用

    目录 一.继承和paisheng 1.继承和派生的基础概念 2.如何定义子类 3.吸收和改造父类成员.添加新成员 二.指针引用 1.指针和引用的异同 2.指针的安全隐患 一.继承和paisheng 1.继承和派生的基础概念 继承指从现有类获得其特性,派生指从已有类产生新的类.原有的类称为基类或父类,新生的类称为子类或派生类.当子类只有一个父类时称为单继承,当子类含有多个父类时称为多继承.如果基类A直接参与了派生类B的派生过程,那么A类称为直接基类:基类的基类称为间接基类. 2.如何定义子类 定义

  • C++类继承时的构造函数

    前言: 子类需要编写自己的构造函数和析构函数,需要注意的是,子类只负责对新增的成员进行初始化和扫尾编写构造和析构函数,父类成员的初始化和扫尾工作由父类的构造函数和析构函数完成. 无论何种类型的继承方式,子类都无权访问父类的所有成员,所以子类对父类的初始化需要父类的构造函数完成.此时,子类的构造函数必须提供父类构造函数所需的参数. 子类构造函数的语法如下: 子类::子类(全部参数表):父类1(父类1参数表),父类2(父类2参数表)      ...对象成员1(对象成员1参数表),对象成员2(对象成

  • C++继承中的对象构造与析构和赋值重载详解

    目录 一.构造/析构顺序及继承性 二.拷贝构造的继承性 三.赋值重载不具有继承性 总结 一.构造/析构顺序及继承性 class A { private: int _a; public: A(int a = 0): _a(a) { cout << "A()" << this << endl; } ~A() { cout << "~A()"<< this <<endl; } }; class B :

随机推荐