继承方式和访问限定符的关系

三种继承方式:

  1. 公有继承

  2. 私有继承

  3. 保护继承

关系:若基类的成员函数为私有,则派生类对基类的私有成员是不可见的,其他的标准为选范围小的为最终访问限定。

保护成员限定符:一些基类成员不想被基类的对象直接访问,但需要在派生类中才能访问,就定义为保护成员。保护成员限定符是因继承才出现的。

理解隐藏

隐藏是指派生类的函数屏蔽了与其同名的基类函数。规则如下:

  1. 如果派生类的函数与基类的函数同名,但是参数不同,此时,不论有无virtual关键字,基类的函数将被隐藏。

  2. 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字,此时,基类的函数被隐藏。

派生类的默认成员函数

在派生类中如果没有显示定义一下六个默认成员函数,编译系统会默认合成这六个成员函数。

  1. 构造函数

  2. 拷贝构造函数

  3. 析构函数

  4. 赋值操作符重载

  5. 取地址操作符重载

  6. const修饰的取地址操作符重载

#include<iostream>
using namespace std;
class person{
  public:
    person(const char* name)
      :_name(name)
    {
      cout<<"person()"<<endl;
    }
    person(const person& p){
      cout<<"person(const person& p)"<<endl;
    }
    person& operator=(const person& p){
      cout<<"person& operator=(const person& p)"<<endl;
      if(this!=&p){
        _name=p._name;
      }
      return *this;
    }
    ~person(){
     cout<<"~person()"<<endl; 
    }
  protected:
    string _name;
};
class student:public person{
  public:
    student(const char* name,int num)
      :person(name)
       ,_num(num){
         cout<<"student()"<<endl;
       }
    student(const student& s)
      :person(s)
       ,_num(s._num)
    {
      cout<<"student(const student& s)"<<endl;
    }
    student& operator=(const student& s){
      cout<<"student& operator=(const student& p)"<<endl;
      if(this!=&s){
        person::operator=(s);//必须指定域,否则会死循环
        _num=s._num;
      }
      return *this;
    }
    ~student(){//析构的时候先清理子类,再清理父类,不需要显示的调用
      cout<<"~student()"<<endl;
    }
  private:
    int _num;
};
int main(){
  student s1("jack",18);
  student s2(s1);
  student s3("rose",16);
  s1=s3;
}

菱形继承

1.png

菱形继承存在二义性以及数据冗余问题。

例,下图中继承的数据为两份,各不相同:

2.png

解决方法:虚继承

在菱形的第二层添加virtual

例:

3.png

相关文章:

C#拾遗之小知识(四):继承

C#基础知识整理:基础知识(2) 类

相关视频:

千锋C语言基础视频教程

以上就是【C++】深入了解继承方式基础知识及其与访问限定符的关系的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

  • 相关标签:继承方式 C++
  • 程序员必备接口测试调试工具:点击使用

    Apipost = Postman + Swagger + Mock + Jmeter

    Api设计、调试、文档、自动化测试工具

    网页生成APP,用做网站的技术去做APP:立即创建

    手机网站开发APP、自助封装APP、200+原生模块、2000+映射JS接口按需打包

    • 上一篇:深入理解C#设计模式之策略模式 角色具体案例分享
    • 下一篇:使用C语言怎样清空输入缓冲区?这里有多种方法值得借鉴

    相关文章

    相关视频


    • c语言中goto语句的含义是什么
    • C/C++深度分析
    • C#中GDI+编程10个基本技巧二
    • 应用绝对路径与相对路径
    • 【C++】深入了解继承方式基础知识及其与访问限定符...
    • Vue3 事件修饰符
    • vue3 指令
    • vue3 基础语法
    • vue3 组合api和选项api介绍

    视频教程分类

    • php视频教程
    • html视频教程
    • css视频教程
    • JS视频教程
    • jQuery视频教程
    • mysql视频教程
    • Linux视频教程
    • Python视频教程
    • Laravel视频教程
    • Vue视频教程

    专题

    【C++】深入了解继承方式基础知识及其与访问限定符的关系