• 技术文章 >后端开发 >C#.Net教程

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

    php是最好的语言php是最好的语言2018-07-30 11:32:01原创1041
    继承方式和访问限定符的关系

    三种继承方式:

    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++
    上一篇:深入理解C#设计模式之策略模式 角色具体案例分享 下一篇:使用C语言怎样清空输入缓冲区?这里有多种方法值得借鉴
    PHP编程就业班

    相关文章推荐

    • c语言中形参的缺省存储类别是什么• C++设计模式浅识装饰模式• 利用c#制作简单的留言板(2)• SUNWEN教程之----C#进阶(三)• SUNWEN教程之----C#进阶(五)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网