派生类向基类转换的可访问性
2015-06-23 14:15
309 查看
感觉基类、派生类的关系是很微妙的,派生类向基类转换的可访问性,C++ Primer(中文5版,Ch15.5)给出了三句解释说明:
只有当Derived公有继承Base时,用户代码才能使用派生类向基类的转换;如果Derived继承Base是protected或private,则用户代码不能使用该转换。
不论Derived以什么方式继承Base,Derived的成员函数和友元都能使用派生类向基类的转换;派生类对于其直接基类的类型转换对于派生类的成员和友元来说永远是可访问的。
如果Derived继承Base的方式是public或protected,则Derived的派生类的成员和友元可以使用Derived向Base的类型转换;反之,如果Derived继承Base的方式是private,则不能使用。
下面说明之:
第一句话,这句话应该好懂。第一句话的意思用代码写出来如下所示:
第二句话的意思写成代码如下所示:
第三句话翻译成代码如下所示,需要加以说明的是,subDerived继承Derived的方式不影响:
以上三句话的理解全是个人理解,若有异议,可以留言或私信
只有当Derived公有继承Base时,用户代码才能使用派生类向基类的转换;如果Derived继承Base是protected或private,则用户代码不能使用该转换。
不论Derived以什么方式继承Base,Derived的成员函数和友元都能使用派生类向基类的转换;派生类对于其直接基类的类型转换对于派生类的成员和友元来说永远是可访问的。
如果Derived继承Base的方式是public或protected,则Derived的派生类的成员和友元可以使用Derived向Base的类型转换;反之,如果Derived继承Base的方式是private,则不能使用。
下面说明之:
第一句话,这句话应该好懂。第一句话的意思用代码写出来如下所示:
class Base { // code segment... }; class D1 : public Base { // code segment... }; class D2 : protected Base { // code segment... }; class D3 : private Base { // code segment... }; int main() { D1 d1 = new D1(); D2 d2 = new D2(); D3 d3 = new D3(); Base B1 = d1; // publiuc继承,正确 Base B2 = d2; // protected继承,错误 Base B3 = d3; // privat继承,错误 }
第二句话的意思写成代码如下所示:
class Base { public: fun(); // others... }; class Derived : public Base { public: friend void UseBaseFun(Base b); void TestFun(Base b); } void UseBaseFun(Base b) { b.fun(); } void Derived::TestFun(Base b) { b.fun(); } int main() { Derived d1 = new Derived(); Derived d2 = new Derived(); // 参数是派生类向基类的转换,正确 d2.UseBaseFun(d1); d2.TestBase(d1); retunr 0; }
第三句话翻译成代码如下所示,需要加以说明的是,subDerived继承Derived的方式不影响:
class Base { public: fun(); // others... }; class Derived : public/protected/private Base { }; class subDerived : public Derived { public: void Test3rdSen(Base b); }; void Test3rdSen(Base b) { b.fun(); }; int main() { Derived d = new Derived(); subDerived sd = new subDerived(); /* 如果subDerived继承Derived的方式是public或protected下面这句 话正确,如果继承方式是private,则下面这句话是错误的 */ sd.Test3rdSen(d); }
以上三句话的理解全是个人理解,若有异议,可以留言或私信
相关文章推荐
- 【读书笔记:C++ primer plus 第六版 中文版】第8章 函数探幽
- [trouble-shooting]android 无法启动X86模式虚拟机的问题解决。
- 如果在安装32位oracle 客户端组件时的情况下以64位模式运行,将出现问题
- Eclipse的ADT插件提示版本问题的解决办法
- python多线程编程----threading模块
- TCP 连接断连问题剖析
- Android Animation学习笔记
- ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
- 免安装版Tomcat配置用户登录项目管理界面
- 腾讯QQ音乐网页版 音频初始化模块解压混淆js源码
- php常用正则表达式
- 黑马程序员---多线程
- ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系
- sgu-284. Grammar
- Hybrid App开发者一定不要错过的框架和工具
- css控制div强制换行
- HTML5学习-Day3
- ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route
- iOS开发-文件管理
- 重新定义CDN:为什么是迅雷?