前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyC++84,私有继承(二)

EasyC++84,私有继承(二)

作者头像
TechFlow-承志
发布2022-08-26 18:02:18
3850
发布2022-08-26 18:02:18
举报
文章被收录于专栏:TechFlow

作者 | 梁唐

大家好,我是梁唐。

这是EasyC++系列的第84篇,来聊聊私有继承。

私有继承(二)

我们继续来看私有继承。

访问基类方法

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

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

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

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

代码语言:javascript
复制
double Student::Average() const {
    if (ArrayDb::size() > 0) {
        return ArrayDb::sum() / ArrayDb::size();
    }
    return 0;
}

访问基类对象

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

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

同样,我们怎么操作呢?

答案是使用强制转换。

代码语言:javascript
复制
const string& Student::Name() const {
    return (const string&) *this;
}

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

访问基类的友元

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

例如:

代码语言:javascript
复制
ostream & operator<<(ostream& os, const Student& stu) {
    os << "Scores for " << (const string&) stu << ":\n";
}

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

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

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

答案是依然不行。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 私有继承(二)
    • 访问基类方法
      • 访问基类对象
        • 访问基类的友元
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档