《C++ 继承篇 imooc》笔记

来源:互联网 发布:阿里云搭ss 编辑:程序博客网 时间:2024/06/10 15:21

继承方式

公有继承 class A:public B保护继承 class A:protected B私有继承 class A:private B
  • 实例化类A时,先实例化类B再实例化A,销毁时先销毁B再销毁A。
  • private只能被本类访问,不能被子类访问。protected可以被子类访问。
    public继承:
基类 派生类 public public protect protect private 无妨访问

protected继承:

基类 派生类 public protected protected protected private 无妨访问

private继承:

基类 派生类 public private protected private private 无妨访问

隐藏

  • 父子关系、成员同名、隐藏
Soldier s;    //Solider类继承Person类,s.play();    //Person中成员函数play()被Soldier中同名成员函数play()隐藏,故输出Soldier类的成员函数play()s.Person::play()    //可调用父类成员函数//Soldier中的数据成员m_iAge隐藏了Person类中数据成员m_iAgevoid work(){    cout << Person::m_iAge;    //输出父类中数据成员    cout << m_iAge;    //输出子类的数据成员}
void Person::play();void Soldier::play(int x);//父类、子类中有同名成员函数时,不能重载,只能隐藏。Soldier s;s.play()    //调用的时Soldier的play(),且因为缺少参数而报错
#include <iostream>    //<>:编译器去系统库中去查找iostream#include "Person.h"    //"":编译器去当前目录下去寻找Person.h

Is-a

int main(){    Soldier s1;    Person per1;    per1 = s1;    //子类可以赋值给父类    s1 = per1;    //错误    Person* p1;    p = &s1;    //父类的指针可以指向子类    Solider* p2;    p2 = &per1;    //错误
  • 父类指针(引用)可以指向(引用)子类对象,
  • 子类的对象赋值给父类时,子类中从父类继承的数据成员被赋值,不是从父类继承的数据成员被截断。
  • 父类指针指向子类时,该指针只能访问从父类继承的数据成员,无法访问子类特有的数据成员。
Person* p = new Soldier;    //父类的指针指向子类的对象时,先执行父类的构造函数,再执行子类的构造函数delete p;    //只执行了父类的析构函数p = NULL;
  • 父类的指针指向堆中子类的对象,并且使用父类的指针释放这段内存,需要使用虚析构函数virtual~Person();,虚析构函数可以被继承的,所以其子类Soldier的析构函数都将是虚析构函数。释放内存时,先执行子类析构函数再执行父类析构函数。

多继承与多重继承

多重继承

class A;class B:public Aclass C:public B

多继承

class A;class B;class C:public A, public B;

虚继承
菱形继承:A->B,A->C,(B,C)->D,此时D中含有两份A中的数据。D访问从A中继承过来的数据,会报错。

class B:virtual public A {}    //关键字virtualclass C:virtual public A {}class D:public B,public C{}    //B,C虚继承A,故D中只有一份A中数据
原创粉丝点击