C++私有继承(二)

 更新时间:2022年01月23日 17:18:44   作者: 梁唐  
这篇文章主要介绍了C++私有继承,在私有继承时,基类的公有对象以及保护对象会变成派生类的私有对象。我们可以在派生类方法当中使用它,但无法通过派生类对象直接调用,但无法访问基类的私有方法和对象,下面具体内容,需要的朋友可以参考一下

文章转自微信 公众号:Coder梁(ID:Coder_LT)

我们继续上一篇文章来看私有继承。

1.访问基类方法

我们知道,在私有继承时,基类的公有对象以及保护对象会变成派生类的私有对象。我们可以在派生类方法当中使用它,但无法通过派生类对象直接调用,但无法访问基类的私有方法和对象。

这个概念我们很好理解,但具体到实现上,我们如何在派生类的方法当中调用基类的公有或者保护方法呢?

比如,在之前的类声明当中我们声明了一个Average方法,用来计算学生考试成绩的平均分。由于Student类是继承了valarray类,而非包含一个valarray的实例,那么我们如何在Average方法的实现当中调用valarray的公有方法呢?

答案是通过解析运算符和类名调用

double Student::Average() const {
    if (ArrayDb::size() > 0) {
        return ArrayDb::sum() / ArrayDb::size();
    }
    return 0;
}

2.访问基类对象

现在我们知道了使用解析运算符可以访问基类的方法,但问题又来了,如果我们要访问的不再是基类的方法而是基类对象本身,那么我们应该怎么办呢?

比如同样例子当中我们有一个Name方法,需要返回学生的姓名。由于Student类只是继承了string类并没有自己的string实例,因此我们需要返回基类对象本身。

同样,我们怎么操作呢?

答案是使用强制转换。

const string& Student::Name() const {
    return (const string&) *this;
}

因为Student类是从string类中派生而来,所以我们是可以将Student对象强制转换成string对象的。

3.访问基类的友元

方法和对象都好办,但友元怎么办呢?因为友元函数并不属于类,所以无法通过类名或者解析运算符搞定。针对这种情况,我们只能取巧,通过显式地对派生类进行类型转换实现。

例如:

ostream & operator<<(ostream& os, const Student& stu) {
    os << "Scores for " << (const string&) stu << ":\n";
}

在这个方法当中,我们显式地将stu实例转变成了基类string的类型,这样就可以调用基类string的友元了。

引用不会自动发生转换,是因为在私有继承当中,在不进行显式类型转换的情况下,不能将派生类的引用或指针赋给基类的引用或指针。

那么问题来了,如果我们使用的是公有继承,那么是不是就可以了呢?

答案是依然不行。

原因也简单,首先在不使用类型转换的情况下,os << stu和自身的友元函数类型匹配, 将会发生递归。其次由于C++支持多继承,所以编译器将会无法确定转换成哪个基类的类型。因此还是需要我们手动进行强制类型转换。

到此这篇关于Easy私有继承的文章就介绍到这了,更多相关Easy私有继承内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言使用openSSL库DES模块实现加密功能详解

    C语言使用openSSL库DES模块实现加密功能详解

    这篇文章主要介绍了C语言使用openSSL库DES模块实现加密功能,简单讲解了DES加密的相关概念,并结合实例形式分析了DES加密的具体实现技巧,需要的朋友可以参考下
    2017-05-05
  • C++利用模板实现消息订阅和分发功能

    C++利用模板实现消息订阅和分发功能

    C++语言支持重载,模板,虚函数等特性,为编写高性能可扩展的程序提供了利器。本文就讲利用模板实现消息订阅和分发功能,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C语言 联合(union)用法案例详解

    C语言 联合(union)用法案例详解

    这篇文章主要介绍了C语言 联合(union)用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++封装IATHOOK类实例

    C++封装IATHOOK类实例

    这篇文章主要介绍了C++封装IATHOOK类的实现方法,对IAT的HOOK实例进行了封装,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C语言Easyx实现贪吃蛇详解

    C语言Easyx实现贪吃蛇详解

    这篇文章主要为大家详细介绍了基于easyx的C++实现贪吃蛇,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)

    详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)

    这篇文章主要介绍了图的应用(最小生成树、拓扑排序、关键路径、最短路径),需要的朋友可以参考下
    2015-08-08
  • C++11中使用using的方法

    C++11中使用using的方法

    在 C++ 中 using 用于声明命名空间,使用命名空间也可以防止命名冲突。这篇文章主要介绍了C++11中使用using的方法,需要的朋友可以参考下
    2021-09-09
  • 浅谈C++内存分配及变长数组的动态分配

    浅谈C++内存分配及变长数组的动态分配

    下面小编就为大家带来一篇浅谈C++内存分配及变长数组的动态分配。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • C++中的继承模式深入详解

    C++中的继承模式深入详解

    这篇文章主要介绍了C++中的继承模式深入详解。继承是OOP设计中的重要概念。在C++语言中,派生类继承基类有三种继承方式:私有继承(private)、保护继承(protected)和公有继承(public)。
    2021-03-03
  • 数据结构 双机调度问题的实例详解

    数据结构 双机调度问题的实例详解

    这篇文章主要介绍了数据结构 双机调度问题的实例详解的相关资料,双机调度问题,又称独立任务最优调度:用两台处理机A和B处理n个作业的实例,需要的朋友可以参考下
    2017-08-08

最新评论