首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个C++类结构设计有关问题

2013-11-25 
一个C++类结构设计问题类似于目录树的结构,现在有根类对象CRoot,子目录对象CChild,CRoot派生于CChild,CChi

一个C++类结构设计问题
类似于目录树的结构,现在有根类对象CRoot,子目录对象CChild,
CRoot派生于CChild,CChild和CRoot都会派生出不同的Root类和Child类,
但是派生出来的Root类想用派生出来的Child类为子类,但这样原来的CRoot类的一些方法和变量就无法继承了。应该如何设计呢?
当前为如下结构
CChild
CRoot :public CChild
CWebChild :public CChild
CWebRoot: public CRoot  (这样的话,无法继承CWebChild的属性)
如果是CWebRoot: public CWebChild 又无法继承CRoot的属性
有什么好的设计思路吗?

[解决办法]
可以考虑使用组合设计模式(Composite)。
该设计模式有3个角色:Component, Composite, Leaf,具体可参考GOF。

个人建议,仅供参考。
[解决办法]
这是有名的钻石问题:(多重继承)
  CChild
 /     \
CRoot  CWebChild
 \     /
 CWebRoot
解决方法:
1、让CRoot,CWebChild虚拟继承自CChild
class CRoot : virtual public CChild
class CWebChild : virtual public CChld
2、CWebRoot多重继承CRoot, CWebChild
class CWebRoot : public CRoot, public CWebChild

[解决办法]
没太仔细看,难道楼主没听过多继承?
[解决办法]
我的看法是,你不需要什么root,和child,实际root和child本质上是没有啥差别的,只是root的Parent为Null而已

你需要两个类,一个是CNode 它有三个主要成员,Parent,Brother,FirstSon
Parent,指向父类的指针
Brother,指向兄弟类的指针
FirstSon指向大儿子类的指针

方法有Addparent\AddBrother\AddSon
....
另一个类是Ctree类,该类只要一个成员pEntry,指向第一个CNode的指针

[解决办法]

引用:
Quote: 引用:

我的看法是,你不需要什么root,和child,实际root和child本质上是没有啥差别的,只是root的Parent为Null而已

多谢,我的Root类要实现对其产生的所有子对象的管理和存储,子对象数量会很大,如果和Root类一样,太费内存。


不是跟你说了,用一个CTree类来做管理吗
[解决办法]
引用:
Quote: 引用:

这是有名的钻石问题:(多重继承)
 

多谢,多重继承的话,感觉效率会低,尤其在大量使用CChild的对象的情况下,另外,虚函数的调用也有歧义的问题。
最关键的一点是,如果我想再扩展一下,比如:
CPicRoot :public CWebRoot时
新的子类为CPicChild:public CWebChild这时又该犯难了

虚函数与虚拟继承是两回事。虚拟继承的作用是确保了生成一份同名的根对象CChild。

另外,也可按接口继承来设计整个系统:所有的接口都是纯虚类。使用工厂模式来返回这些接口的具体实现品。
[解决办法]
引用:
这是有名的钻石问题:(多重继承)
  CChild
 /     \
CRoot  CWebChild
 \     /
 CWebRoot
解决方法:
1、让CRoot,CWebChild虚拟继承自CChild
class CRoot : virtual public CChild
class CWebChild : virtual public CChld
2、CWebRoot多重继承CRoot, CWebChild
class CWebRoot : public CRoot, public CWebChild
++
[解决办法]
引用:
类似于目录树的结构,现在有根类对象CRoot,子目录对象CChild,
CRoot派生于CChild,CChild和CRoot都会派生出不同的Root类和Child类,
但是派生出来的Root类想用派生出来的Child类为子类,但这样原来的CRoot类的一些方法和变量就无法继承了。应该如何设计呢?
当前为如下结构
CChild
CRoot :public CChild
CWebChild :public CChild
CWebRoot: public CRoot  (这样的话,无法继承CWebChild的属性)
如果是CWebRoot: public CWebChild 又无法继承CRoot的属性
有什么好的设计思路吗?

可以这样吗?
CWebRoot:public CRoot, public CWebChild
同时继承两个类
[解决办法]
引用:
Quote: 引用:

类似于目录树的结构,现在有根类对象CRoot,子目录对象CChild,
CRoot派生于CChild,CChild和CRoot都会派生出不同的Root类和Child类,
但是派生出来的Root类想用派生出来的Child类为子类,但这样原来的CRoot类的一些方法和变量就无法继承了。应该如何设计呢?
当前为如下结构
CChild
CRoot :public CChild
CWebChild :public CChild
CWebRoot: public CRoot  (这样的话,无法继承CWebChild的属性)
如果是CWebRoot: public CWebChild 又无法继承CRoot的属性
有什么好的设计思路吗?

可以这样吗?
CWebRoot:public CRoot, public CWebChild
同时继承两个类
是的,可以多重继承。C++的变态之处
[解决办法]
1、 C++是支持多重继承的, 跟JAVA可以实现多个接口一样
2、 对于树形结构,不管是根节点还是子节点,应该是同一种类型,不需要区分根节点和子节点,只不过根节点的父节点指针为空而已。

3、 如果lz确实在根节点和子节点上,有不同的逻辑需求,
可以先设计一个节点父类叫TreeNode实现所有节点共同的属性,
然后设计一个业务逻辑类的父类Action,不同子节点的不同需求分别继承这个Action,得到一系列的XXXAction。
最后RootNode : public TreeNode, public XXXAction, public XXXAction
ChildNode : public TreeNode, public XXXAction, public XXXAction, public XXXAction
[解决办法]
这个没这么复杂吧 先分层次 再定结构
1.有个NODE类 这是一个基类 成员有parent(NODE类型),child(NODE类型)
2.NODE类作为基类提供接口最大化,需要用到的就重载.
3.尽量不要用到多重继承,从C++对象模型来说效率低 容易产生歧义 后面维护和扩展比较麻烦。

热点排行