第五周学习

5.1继承和派生

  • 继承:在定义一个新类的时候,如果该类与某个已定义过的类相似,则可以将原来的类定义为基类,现在的定义为派生类
  • 派生类是通过对基类进行修改和扩充得到的,派生类可以扩充新的成员变量和成员函数
  • 派生类拥有基类所有成员函数和成员变量
class 派生类名:public 基类名
{
};
  • 派生类在内存中储存时,最前面先是基类的对象,然后后面跟上自己的变量,成员函数等

5.2继承关系和复合关系

  • 继承关系:
    • 派生类一定是基类的一种
  • 复合关系:
    • k是类d的一个对象,类c中有k这个成员变量,则c和d是复合关系
    • 不能说一个类是另外的一种

5.3基类/派生类同名成员函数和protected关键字

  • 同名成员函数
class base{
    int j;
public:
    int i;
    void func();
};
class derived:public base{
public:
    int i;
    void access(){
        j=5;//这是基类的私有成员,不能这样赋值
        i=5;//派生类的i赋值
        base::i=5;//基类的i赋值
        func();//调用派生类func()
        base::func();//调用基类的func()
    }
    void func();
};
derived obj;
obj.i=1;//派生类自身i赋值
obj.base::i=1;派生类中的基类i赋值
//所以不建议再派生类中定义与基类相同名字的成员变量
  • protected 关键字
  • 基类private成员可被以下访问:
    • 基类成员函数
    • 基类友元函数
  • 基类的public成员可被以下访问:
    • 基类成员函数
    • 基类友元函数
    • 派生类成员函数
    • 派生类友元函数
    • 其他函数
  • 基类protected成员可被以下访问:
    • 基类成员函数
    • 基类友元函数
    • 派生类的成员函数可以访问当前对象的protected成员
class father{
protected: 
    int n;
};
class son:public father{
void a(){
    n=3;//可以访问当前对象的protected成员
    a.n=5;//只能访问当前对象,这不是当前对象
}
};

5.4派生类构造函数

  • 派生类对象包括基类对象
  • 先执行基类构造函数再执行派生类构造函数,先执行派生类析构函数,再执行基类析构函数
构造函数名(形参表):基类名(基类构造函数实参表){
}
class a{
public:
    int m,n;
    a(int i,int j):m(i),n(j){}
};
class b:public a{
public:
    int o;
    b(int i,int j,int k):a(i,j),o(k){}
};

5.5public继承的赋值兼容规则

class base{};
class derived:public base{};
base b;
derived d;
  • 派生类的对象可以赋值给基类对象
    b=d;
  • 派生类对象可以初始化基类的引用
    base & br=d;
  • 派生类对象地址可以赋值给基类指针
    base* p=&d;很重要,后面程序很多用到
  • 只有派生方式是public的时候上诉三个才可行
  • 声明派生类的时候,只需要列出它的直接基类即可
  • 派生类包括所有直接基类的变量和间接基类的变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值