继承多态

1.继承方式

私有继承  ,保护继承     公有继承

私有继承:

基类                               派生类                               对外接口

pulbic                             private                                不可见

protect                           private                                 不可见

private                           不可见                                  不可见

保护继承:

public                             protect                                    不可见

protect                           private                                   不可见

private                           不可见                                    不可见

共有继承

pulbic                            public                                       可见

protect                           protect                                    不可见

private                           private                                     不可见

 

 

这是a kind of关系

Base 假设成人

Derive 假设成学生

不能把人赋值给学生,学生会写作业,但是不是所有人都会写作业

可以把学生赋给人,人会吃饭,学生也会吃饭,就是人会做的事情,学生也会做

 

基类指针->派生类          它只能访问基类部分

如果是没有虚函数的情况,基类和派生类的同名函数是隐藏,而且这时候call     的Base方法,因为编译期间就看见是

Base类,就直接去Base中找我们要的方法。地址就被确定下来了。

 

 

2.重载          隐藏         覆盖

重载

目的是多态

函数重载,函数名相同,函数类型不同,形参类型不同,形参个数不同,形参顺序不同。作用域相同

隐藏

在基类和派生类集成结构中,派生类的同名成员把基类同名成员给隐藏了

 

覆盖

基类和派生类继承结构中,返回值,函数名,参数列表都相同,而且基类的该函数是virtual函数,那么派生类的函数也是virtual函数了。这就是覆盖关系。

 

虚函数

inline 函数编译时候展开代码,没有函数地址,可是其实

构造函数是构造对象的,我们知道ptr指针一般是在构造函数里第一行执行生成的,我们都没有ptr,怎么去虚表里找呢

构造函数不能写成虚函数

ptr一般是在构造函数的第一行里生成,但是没有对象生成,或者说你构造函数本身去构造ptr指针,问你怎么去用ptr指向构造函数。

静态函数不能写成虚函数

不能写成虚函数,因为静态成员函数调用约定不是this_call 调用约定

虚析构,析构函数是可以写成虚函数的

(1)如果父类的析构函数不加virtual关键字
当父类的析构函数不声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。
(2)如果父类的析构函数加virtual关键字
当父类的析构函数声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。

 

Base b;
Derive *pd = static_cast<Derive *>(&b);
pd->show();   //基类和派生类都有不带show,这里是用什么show方法是基类的

派生类指针不能指向基类的指针

通过强转之后,去处理这个问题。但是这时候,还是看你指向的对象就用谁的虚表,而不是关注指针的类型

 

动多态是否破坏了封装性

我想着多态是否有破坏封装性呢。访问限定只是在语法上限定,意味着在编译期间限定,但是动多态是在运行阶段时候call寄存器。我们如果把派生类私有成员里放置了一个show方法,然后在Base 中public也有个show方法,然后Base指针指向一个派生类

调用show方法,最后调用派生类的show方法,这个时候那么说是否破坏了它的封装性呢?

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值