26、不一样的C++系列--继承的基础知识

来源:互联网 发布:铜交易软件 编辑:程序博客网 时间:2024/05/20 20:21

继承

继承的概念

类之间的两大关系:组合和继承:

  • 组合关系的特点:
    • 将其它类的对象作为自己的成员使用
    • 当前类的对象与成员对象的声明期相同
    • 成员对象在用法上与普通对象完全一致

组合关系的代码示例:

class Memory{public:    Memory()    {        cout << "Memory()" << endl;    }    ~Memory()    {        cout << "~Memory()" << endl;    }};class Disk{public:    Disk()    {        cout << "Disk()" << endl;    }    ~Disk()    {        cout << "~Disk()" << endl;    }   };class Computer{    Memory mMem;    Disk mDisk;public:    Computer()    {        cout << "Computer()" << endl;    }    ~Computer()    {        cout << "~Computer()" << endl;    }};
  • 继承(父子关系):

    • 子类拥有父类的所有属性和行为
    • 子类就是一种特殊的父类
    • 子类对象可以当做父类对象使用
    • 子类中可以添加父类没有的方法和属性
  • C++中通过下面的方式描述继承关系

class Parent{    int mv;public:    void method() {};};class Child: public Parent  // 描述继承关系{};
  • 重要规则:
    • 子类就是一个特殊的父类
    • 子类对象可以直接初始化父类对象
    • 子类对象可以直接赋值给父类对象

继承关系代码示例:

#include <iostream>#include <string>using namespace std;class Parent{    int mv;public:    Parent()    {        cout << "Parent()" << endl;        mv = 100;    }    void method()    {        cout << "mv = " << mv << endl;    }};class Child : public Parent{public:    void hello()    {        cout << "I'm Child calss!" << endl;    }};int main(){       Child c;    c.hello();    c.method();    return 0;}

继承的访问级别

  • 根据面向对象理论:

    • 子类拥有父类的一切属性和行为
    • 子类能够直接访问父类的私有成员
  • 根据C++语法:

    • 外界不能直接访问类的private成员
    • 子类不能直接访问父类的私有成员

举一个例子:

class Parent{private:    int mv;public:    Parent()    {        mv = 100;    }    int value()    {        return mv;    }};class Child : public Parent{public:    int addValue(int v)    {        //子类直接访问父类的私有成员变量        mv = mv + v;        }};int main(){       return 0;}

运行结果如下:

nethanhandeMacBook-Pro-2:代码 nethanhan$ g++ 44-1.cpp 44-1.cpp:27:9: error: 'mv' is a private member of 'Parent'        mv = mv + v;    // ???? <C8><E7><BA>η<C3><CE>ʸ<B8><C0><E0><B5>ķǹ...        ^44-1.cpp:9:9: note: declared private here    int mv;        ^44-1.cpp:27:14: error: 'mv' is a private member of 'Parent'        mv = mv + v;    // ???? <C8><E7><BA>η<C3><CE>ʸ<B8><C0><E0><B5>ķǹ...             ^44-1.cpp:9:9: note: declared private here    int mv;        ^2 errors generated.

结果里说到 mv 是一个私有成员变量,在子类中不能直接私有成员。所以需要使用另外一个关键字 protested

  • 关键字 protected 的意义:
    • 修饰的成员不能被外界直接访问
    • 修饰的成员可以被子类直接访问
    • 没有protected就无法完成真正意义上的代码复用

使用示例:

class Parent{//这里使用关键字 protected来声明//子类就可以直接访问到//而且外界不可以直接访问到protected:    int mv;public:    Parent()    {        mv = 100;    }    int value()    {        return mv;    }};class Child : public Parent{public:    int addValue(int v)    {        //子类可以直接使用父类的成员变量        mv = mv + v;        }};

继承方式

  • C++中支持三种不同的继承方式
    • public 继承
      • 父类成员在子类中保持原有访问级别
    • private 继承
      • 父类成员在子类中变为私有成员
    • protected 继承
      • 父类中的公有成员变为保护成员,其它成员保持不变
  • C++中的默认继承方式为private
  • 继承方式比较
继承方式\父类成员访问级别 public protected private public public protected private protected protected protected private private private private private
  • 注意:
    • 一般而言,C++工程项目中只使用public 继承
    • C++的派生语言只支持一种继承方式(public 继承)
    • protected 和 private 继承带来的复杂性远大于实用性
原创粉丝点击