美文网首页
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 继承带来的复杂性远大于实用性

相关文章

  • JNI基础 -- C++基础知识(继承多态,虚函数 )

    继承 在Java中类的继承只能是单继承,但是在C++中可以多继承。继承是通过一个冒号表示的,如下: C++中的继承...

  • JAVA核心技术总结(五六章)继承&接口与内部类

    第五章 继承 在Java中,所有的继承都是公有继承,没有C++的私有继承和保护继承 Java同C++一样,子类不能...

  • 关于虚继承的一些问题(转)

    关于C++中的虚拟继承的一些总结 C++类的大小 1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基...

  • C/C++基础知识(四)——继承、多态和虚函数

    c++中的继承使用冒号(:),可以指定继承方式(private,protect,public),支持继承多个父类,...

  • 第8篇:C++ 类多继承(中篇)

    前一篇介绍了C++继承的特征,我们本篇将介绍C++继承的分类 单继承:在单一继承中,一个类只能从一个类继承。 即一...

  • 网易问题总结

    1. C++语言问题 1. Java用接口代替C++中多继承,有什么优势? 避免像C++那样出现多继承而导致的关系...

  • C++之虚继承

    本文主要介绍C++中虚继承的相关内容 I、菱形继承 要了解C++的虚继承,首先要先了解菱形继承的概念及其带来的危害...

  • Java 基础 - 继承

    参考 C++多继承有什么坏处,Java的接口为什么可以摈弃这些坏处?C++多继承(钻石继承)的问题和解决C++继承...

  • C++中的继承

    继承的概念 类之间的两大关系:组合和继承: 组合关系的特点:将其它类的对象作为自己的成员使用当前类的对象与成员对象...

  • pybind11—类(继承,重载,枚举)

    前言 在C++类中, 继承, 函数重载是重要的特征。 继承 重载 overloadpy::overload_cas...

网友评论

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

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