本篇内容介绍了“C++私有继承方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
我们知道,在私有继承时,基类的公有对象以及保护对象会变成派生类的私有对象。我们可以在派生类方法当中使用它,但无法通过派生类对象直接调用,但无法访问基类的私有方法和对象。
这个概念我们很好理解,但具体到实现上,我们如何在派生类的方法当中调用基类的公有或者保护方法呢?
比如,在之前的类声明当中我们声明了一个Average
方法,用来计算学生考试成绩的平均分。由于Student
类是继承了valarray
类,而非包含一个valarray
的实例,那么我们如何在Average
方法的实现当中调用valarray
的公有方法呢?
答案是通过解析运算符和类名调用
double Student::Average() const { if (ArrayDb::size() > 0) { return ArrayDb::sum() / ArrayDb::size(); } return 0; }
现在我们知道了使用解析运算符可以访问基类的方法,但问题又来了,如果我们要访问的不再是基类的方法而是基类对象本身,那么我们应该怎么办呢?
比如同样例子当中我们有一个Name
方法,需要返回学生的姓名。由于Student
类只是继承了string
类并没有自己的string实例,因此我们需要返回基类对象本身。
同样,我们怎么操作呢?
答案是使用强制转换。
const string& Student::Name() const { return (const string&) *this; }
因为Student
类是从string类中派生而来,所以我们是可以将Student
对象强制转换成string
对象的。
方法和对象都好办,但友元怎么办呢?因为友元函数并不属于类,所以无法通过类名或者解析运算符搞定。针对这种情况,我们只能取巧,通过显式地对派生类进行类型转换实现。
例如:
ostream & operator<<(ostream& os, const Student& stu) { os << "Scores for " << (const string&) stu << ":\n"; }
在这个方法当中,我们显式地将stu实例转变成了基类string
的类型,这样就可以调用基类string的友元了。
引用不会自动发生转换,是因为在私有继承当中,在不进行显式类型转换的情况下,不能将派生类的引用或指针赋给基类的引用或指针。
那么问题来了,如果我们使用的是公有继承,那么是不是就可以了呢?
答案是依然不行。
原因也简单,首先在不使用类型转换的情况下,os << stu和自身的友元函数类型匹配, 将会发生递归。其次由于C++支持多继承,所以编译器将会无法确定转换成哪个基类的类型。因此还是需要我们手动进行强制类型转换。
“C++私有继承方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。