C++多重继承带来的问题
2016-04-18 16:41
190 查看
首先上图,咱们看图说话!
![](https://images2015.cnblogs.com/blog/450460/201604/450460-20160418164030679-150646183.png)
橙色表示变量,使用private修饰。
如图,假设Person类的变量name只能通过input方法来输入。
那么继承自Person的Student及Teacher类中s_input、t_input函数都将通过调用Person中的p_input方法来实现name变量的输入。
此时通过virtual继承方式,StuTeach类中只有Person的一份拷贝。
那么在StuTeach的类中的input方法,我们需要分别调用Student及Teacher的类中s_input、t_input来实现num及subject等变量的输入。显然此时Person类中的input方法被执行了两次。
那么我们接下来想一下是什么地方设计的不合理或者不符合逻辑?
在Student类中需要输入其父类的变量,我们显然想到且只能调用input方法来改变其中的private修饰的变量。
Teacher类同理,此时貌似唯一的解决方案就是将Person类中的name修改为用protected修饰,然后在StuTeach中直接修改其变量,此时StuTeach需要知道其根父类Person的内容。
另外一种方法,针对变量加入set/get方法,这个时候依然需要StuTeach类了解根父类Person的内容方可达到。
因为都需要通过根父类来操作根父类的变量,所以这两种方法,我认为没有本质上的区别。
那么我们是否有其他方式来解决多重继承带来的根父类数据的迷之操作困难?
目前我尚未有答案。
![](https://images2015.cnblogs.com/blog/450460/201604/450460-20160418164030679-150646183.png)
橙色表示变量,使用private修饰。
如图,假设Person类的变量name只能通过input方法来输入。
那么继承自Person的Student及Teacher类中s_input、t_input函数都将通过调用Person中的p_input方法来实现name变量的输入。
此时通过virtual继承方式,StuTeach类中只有Person的一份拷贝。
那么在StuTeach的类中的input方法,我们需要分别调用Student及Teacher的类中s_input、t_input来实现num及subject等变量的输入。显然此时Person类中的input方法被执行了两次。
那么我们接下来想一下是什么地方设计的不合理或者不符合逻辑?
在Student类中需要输入其父类的变量,我们显然想到且只能调用input方法来改变其中的private修饰的变量。
Teacher类同理,此时貌似唯一的解决方案就是将Person类中的name修改为用protected修饰,然后在StuTeach中直接修改其变量,此时StuTeach需要知道其根父类Person的内容。
另外一种方法,针对变量加入set/get方法,这个时候依然需要StuTeach类了解根父类Person的内容方可达到。
因为都需要通过根父类来操作根父类的变量,所以这两种方法,我认为没有本质上的区别。
那么我们是否有其他方式来解决多重继承带来的根父类数据的迷之操作困难?
目前我尚未有答案。
相关文章推荐
- C/C++内存泄漏检测
- 【c/c++】list
- c++ 字符串连接问题
- Effective C++笔记(三):资源管理
- terminate called after throwing an instance of 'std::bad_alloc
- 基于C语言实现简单的走迷宫游戏
- 输入流对象cin读取输入流的三种方式
- C++虚析构函数
- C++ STL中vector的内存机制和性能分析
- C语言结构体的字节对齐原则
- C++时间,文件及字符常用函数总结
- c++实现mysql数据库数据缓存
- 贪吃蛇C语言代码
- 【C++】日期类+日期万年历+日期计算器
- 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)
- 介绍一个类型安全的回调库:libsigc++
- C语言中的可变参数列表
- C语言获取汉字拼音首字母
- Item 05:了解C++默默编写并调用哪些函数
- 深度探索C++关键字之 virtual