美文网首页
C++中的继承

C++中的继承

作者: nethanhan | 来源:发表于2017-10-14 10:54 被阅读0次

    继承的概念

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

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

    组合关系的代码示例:

    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;    // 子类直接访问父类的私有成员变量
            ^
    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;    // 子类直接访问父类的私有成员变量
                 ^
    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 继承带来的复杂性远大于实用性

    相关文章

      网友评论

          本文标题:C++中的继承

          本文链接:https://www.haomeiwen.com/subject/nxsxuxtx.html