C++——继承(继承与转换的兼容 以及 单继承 &多继承& 菱形继承的特点)

原创 2018年04月15日 16:27:24

首先,我们得知道,面向对象的三大语言:封装 继承 多态

继承:(父类/基类, 子类/派生类)

是面向对象的复用手段。通过继承定义一个类,继承是类型之间的关系建模,共享公共的东西,各自实现本质不同的东西。
——在继承关系里,基类的成员类的成员派生类的成员,由此达到复用目的。

  • 成员访问限定符&继承关系:
    这里写图片描述
  • 三种继承关系下基类成员在派生类的访问关系变化:
    这里写图片描述

  • 问题1:为什么已经有了私有成员还要有保护成员?

答:基类的私有成员在派生类中是无法被访问的,但如果一些基类成员,不想被基类对象直接访问,需要在派生类中访问,就定义为保护成员。保护成员限定符是为了继承而生的。

  • 问题2:public / protected / private继承之间的区别是什么?
public继承是一个接口继承,保持 is-a 原则,(我是一个你)
每个父类可用的对象对子类也可用,每个子类对象也是一个父类对象。

protected / private 继承是一个实现继承,是 has -a 的关系原则,(我有一个你)
基类的部分成员,并未完全成为子类接口的一部分。
  • 问题3:什么是成员不可见?

    答:不管是哪种继承方式,在派生类内部都可以访问基类的共有成员和保护成员,基类的私有成员存在,但是在派生类中无法访问。(不可见)

  • 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。


    -

继承与转换——赋值兼容规则——public继承

  • 子类对象可以赋值给父类对象(切割/切片)
  • 父类对象不可以赋值给子类对象
  • 父类的指针/ 引用可以指向子类对象
  • 子类的指针/ 引用不能指向父类对象(可以通过强制类型转换实现)

代码分析:

class Person
{
public:
    void Show()
    {
        cout<<_name << endl;

    }
protected:
    string _name;
private:
    int _age;

};






//class Student :private Person
//class Student :protected Person

class Student :public Person
{
public:int _num;
};

int main()
{
    Person p;
    Student s;

    p = s;//1.子类对象可以直接赋值给父类对象(切割/切片)

    //s = p;//2.父类对象不能直接赋值给子类对象(空间不足)


          //3.父类的指针/引用,可以指向子类对象
    Person *p1 = &s;

    Person&r = s;//不加const也能引用,——天然支持


          //4.子类的指针/引用不能指向父类的对象(但可以通过强制转换实现)
    Student*p2 = (Student*)&p;
    Student&r2 = (Student&)p;

    //const Student &r2 = p;//编不过:天然不支持





    system("pause");
        return 0;

}

这里写图片描述
这里写图片描述

继承体系中的作用域:

  • 在继承体系中,基类和派生类都有独立的作用域
  • 子类和父类中有同名成员,子类成员将屏蔽父类对成员的直接访问。
    (在子类成员函数中,可使用基类::基类成员 )访问 ——隐藏(重定义)

  • 注意:在实际中最好不要定义同名成员。



派生类的构造函数&&析构函数

这里写图片描述

单继承&&多继承

  • 单继承:一个子类只有一个直接父类时称这个继承关系为单继承。
  • 多继承:一个子类有两个或两个以上直接父类称这个继承关系为多继承。
    这里写图片描述
  • 菱形继承
    这里写图片描述

菱形继承存在问题:二义性和 数据冗余(虚继承解决)
这里写图片描述

注:1.虚基表中存的是一个偏移量(相对地址,而不是实际地址)
2.同类型对象共享一个虚基表(偏移量相同)
3.虚基表的使用:节省空间

【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)

c++单继承、多继承、菱形继承内存布局(虚函数表结构)
  • SuLiJuan66
  • SuLiJuan66
  • 2015-10-04 18:44:28
  • 3511

c++单继承、多继承、菱形继承内存布局(虚函数表结构)

单继承:只有一个基类和一个派生类 class Base { public: virtual void fun1() { cout "Base::func1()" ...
  • hiyajo_salieri
  • hiyajo_salieri
  • 2017-04-05 22:06:15
  • 243

c++中的单继承,多继承(此处着重讲菱形继承)的内存布局模型详解

最近正好复习到继承的相关部分,想着把自己所学的东西还是再次归纳整理一遍,那么接下来就简单地梳理一下关于继承的一些知识点。 切入正题,什么是继承?“继承是c++语言的一种重要机制,该机制自动地为一个类提...
  • melody_1016
  • melody_1016
  • 2016-10-29 20:13:25
  • 539

C++之单继承与多继承

继承性是面对对象程序设计中最重要的特征之一它允许在既有类的基础上创建新类,并可以根据所面对问题的不同情况对新类进行更具体,更详细的说明与操作。 通过代码看基类与派生类class A /...
  • qq_36782456
  • qq_36782456
  • 2017-04-13 16:37:21
  • 1462

单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承??单继承:一个子类只有一个直接父类。多继承:一个子类有两个或多个直接父类。单继承中的虚函数表分析:示例程序:#include  using namespace...
  • fucangzxx
  • fucangzxx
  • 2016-05-29 21:35:55
  • 402

C++中的多态、单继承、多继承、菱形继承、菱形虚拟继承

C++中的继承体系,有单继承、多继承、菱形继承、菱形虚拟继承,以及各类型的对象模型,我们今天做一个简单的剖析 (1)什么多态? 所谓多态,就是“多种形态”。在面向对象的方法中一般是这样描述多态的:...
  • lyl194458
  • lyl194458
  • 2017-08-02 22:06:23
  • 194

多继承(非虚继承)派生类对象内存结构(基类有虚函数)

在多继承中(非虚继承),探索一下派生类对象在内存中怎么分布的。
  • KangRoger
  • KangRoger
  • 2014-08-01 08:18:51
  • 1957

C++ 虚函数 单一继承 多重继承 单一虚继承 菱形虚继承 的简洁总结

虚函数所谓虚函数,从其功能上来看是采用虚调用的方式;当子类重新定义其父类的虚函数以后,父类指针根据付给他的不同子类指针,动态地调用属于子类的该函数;假如一个类有虚函数,则该类会因为维护该虚函数,而额外...
  • misol
  • misol
  • 2011-07-13 21:07:35
  • 3241

C++之钻石问题和解决方案(菱形继承问题)

在C++中,什么叫做钻石问题(也可以叫菱形继承问题),怎么避免它? 下面的图表可以用来解释钻石问题。 假设我们有类B和类C,它们都继承了相同的类A。...
  • czjuttsw
  • czjuttsw
  • 2012-12-27 14:17:10
  • 16946

C++继承(单继承、多继承、菱形继承)内存模型的深入研究

继承的概念:继承机制:可以利用已有的数据类型来定义新的数据类型,所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。OOP强调软件的可重用性(software reuseablility...
  • RUN32875094
  • RUN32875094
  • 2018-02-27 00:28:56
  • 55
收藏助手
不良信息举报
您举报文章:C++——继承(继承与转换的兼容 以及 单继承 &多继承& 菱形继承的特点)
举报原因:
原因补充:

(最多只允许输入30个字)