派生类成员的标识与访问

对派生类的成员按访问属性可以分为:
1)不可访问成员
从派生类基类的私有成员继承而来,派生类的对象模块没有办法访问。

2)private成员
派生类内部可以访问,建立派生类对象模块无法访问,继续派生就变不可访问成员。

3)protected成员
与2)相似
不同之处在于
继续派生就可以变成私有成员或保护成员。

4)public成员

一、作用域分辨符
1.
在不同的作用域声明的标识符存在一个可见性原则,称为隐藏原则
if( 作用域1⊆作用域0)
外层声明了一个标识符,if内层没有声明同名的标识符,则外层的标识符依然在内层可见,if内层声明了同名的标识符,则外层的不可见,这个现象叫做隐藏规则。

在继承中派生类在内层则满足隐藏规则,对于派生类与基类同名的成员函数,即使参数表不同也会被隐藏,要注意overload只在相同的作用域中才有

在这种情况下,if要访问被隐藏的成员,则需要使用作用域分辨符和基类名来限定。

syntax:
类名::成员名
类名::成员名(参数表)

为了不产生二义性,可以使用using关键字加以澄清,作用是将一个作用域中的名字引入到另一个作用域中。
例:
using Base1::fun;
注意此时会出现overload了。

2.
需要注意到的一个问题是,基类间存在继承关系时会出现什么情况?

假设有三个基类Base0,Base1,Base2,Base0公有派生了类Base1与Base2,再有Base1与Base2作为基类共同公有派生了新类Derived类

Base0中的成员派生到了Base1,Base2中,继续派生,就派生到了Derived类中,如果此时用Base0来限定,则无法表明是从Base1,还是从Base2继承而来,则必须用直接基类来进行限定,不用间接基类。

对于数据成员来说,就会出现多份同名副本,可以存放不同的数值。

对于函数成员始终只有一个副本,但因要调用非静态成员函数总是针对特定对象,需要将指向该类的一个对象的指针作为隐含参数传递给被调用函数来初识化this指针,则也要限定。

二、虚基类
对于上述多个副本的情况,有时会浪费较多的空间,为了解决这个问题,可以将共同基类设置为虚基类,这是从不同的路径过来的同名数据成员在内存中就只有一个副本,同一个函数名也只有一个映射。

syntax:
class DerivedClassName : virtual 继承方式 BaseName

if虚基类声明有非默认形式的(即带形参的)构造函数,并且没有声明默认构造函数,则在整个继承关系中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化列表中对列出的虚基类初始化。

构造函数执行顺序:
1)先执行虚基类的构造函数;
2)按照继承声明列表分别执行它们的构造函数,但不再执行虚基类的构造函数;
3)…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值