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

三种继承方式:

  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语言基础视频教程

更多相关文章

  1. C++11新特性- 纯虚函数和final说明符的用法
  2. C++11新特性 - 多态和虚函数,override说明符
  3. 探索C++虚函数在g++中的实现(动多态)_虚函数表剖析
  4. 第一章C++:函数返回值、GNU编译器命令
  5. 第六章C++:函数基础与应用
  6. C++异常处理:系统函数terminate的调用
  7. C++学习基础知识--this指针、静态成员、常量成员函数
  8. 深度解析C++的函数模板与类模板
  9. C++类的静态数据成员和静态成员函数

随机推荐

  1. 在Android中查看和管理sqlite数据库
  2. ImageView通过matrix实现手势缩放
  3. Unity3D -- 打包Android多个AndroidManif
  4. Android LaunchMode and StartActivityFo
  5. eclipse中android模拟器找不到的解决办法
  6. 获得Android Linux系统增删文件的权限
  7. Android中HandlerThread的使用及源码解析
  8. Android(安卓)ViewPager多页面滑动切换以
  9. Android(安卓)NDK开发之旅1--NDK介绍
  10. [Android官方开发者博客.翻译]Android的H