实际编程中,类的继承最好控制在几层?为什么?

解决方案 »

  1.   


    一般都四层,
    最顶层一般都是  CObject你把这层 忽略了。
      

  2.   

    不会吧才三层,MFC里 都有七八层的啊
    看需要而定吧
      

  3.   

    呵呵,我这里所说的类不是MFC中的类。我面试的公司更偏向于SDK编程。
      

  4.   

    vcleaner (我没当大哥很久了.......)  你这么强的人还需要棉试啊如果我是老板,八人大轿把你抬进来
      

  5.   

    使用继承一般处于2种目的。
    1)代码复用——特点是没有添加虚函数,而只是使用基类所具有的功能。通过继承复用代码很方便,但是继承是耦合性最强的重用方式,因此最好采用聚合代替继承。处于代码重用的考虑而使用的继承一般不会超过3层。2)为了逻辑抽象使用继承——特点是有虚函数。在使用虚函数的时候会出现一些问题,比如
    class A
    {
      virtual void Func1();
      virtual void Func2();
    }void A::Func1()
    {
      DoSometh;
      Func2();
    }
    void A::Func2()
    {  DoSometh;}Class B : public A
    {
      virtual void Func1();
    }void B::Func1()
    {
      DoOtherThing;
      Func2();
      DoAnotherThing;
    }Class C : public B
    {
      virtual void Func2();
    }void C::Func2()
    {
      DoSomeOtherThing;
    }这个时候你调用C类的对象的Func1函数,你必须得保证Func2()的实现符合原来A定义的语义。3层都这个麻烦了,还敢多用几层吗?  呵呵
      

  6.   

    vcleaner (我没当大哥很久了.......) 不用面试了,直接到我公司来工作,就凭csdn的2颗星星
      

  7.   

    vcleaner (我没当大哥很久了.......)  你这么强的人还需要棉试啊如果我是老板,八人大轿把你抬进来
    ==================================
    呵呵,现在还有不需要面试的吗?还笔试了呢,虽然我最讨厌笔试,但是我还是耐心的做了。
    当时的想法只有一个:不管能不能成,做做试卷就当复习、练习了。
      

  8.   

    To  lengyuye2005(lengyuye):
    C++的聚合虽然能实现复用,但是我觉得不是一个好办法。因为聚合需要细小的设计,并且设计出来的类针对性比较强,复用起来的空间比较小,或者说对以后的可借鉴性比较少。
      

  9.   

    其实,优先使用聚合的原则是在gof的设计模式里面提到的,一直也存在争论。
    我在具体工作中,也没有发现有太大的利弊区别,可能是受到了开发领域的限制吧。希望 vcleaner(我没当大哥很久了.......) 可以举些例子谈谈。
      

  10.   

    : laiyiling(陌生人 V2.0) ( ) 信誉:408 你的信誉分怎么这么高的啊?还有 旁边的中文名字是在哪里改的啊
      

  11.   

    up .study inherits elemetary
      

  12.   

    不是流行 n 层吗,咱们来个 n + 1 层,层层 virtual 、override 不让人晕菜就不算高手。
      

  13.   

    首先要根据问题的大小而定,要看我们要实现的问题中有多少对象,能分成多少类,各个类之间的共性有多少,然后合理安排它们的抽象类。但有一个是肯定的,继承的层次多会影响运行的效率,所以有时要考虑在抽象顶层基类时要少分配一些成员,把这些成员分配给第二层的类(即多派生几个),这样第二层类的个数会多一些,然后归划第三层的类,最后具体的对象就可以用第三层或第四层类进行实例化,所以一般而言有三到四层的继承就差不多了。vcleaner (我没当大哥很久了.......) 你觉得我这样理解合适吗?愿大家共勉!!
      

  14.   

    不是流行 n 层吗,咱们来个 n + 1 层,层层 virtual 、override 不让人晕菜就不算高手。
    _________________
    流行的n层也不是指继承啊
      

  15.   

    如果不考虑CObject这些要素。2-3层次就好了。多了就不便于理解和调试。
      

  16.   

    看到这么多牛人,俺也来见识见识…………下面是俺的想法,有些不对,高手多多指教。声明:俺用的是.net  没用过C++面向对象来说: 类应该分级细化  但是实际应用中
    第一:每一个类的实例都回有一个指向虚方法的指针,这些虚方法需要动态调用,性能上会有点下降(俺知道.net中好像是这样子,不过俺记得mfc4.2好像是并没有用标准C++的编译器来实现多态的,而是用了一连串很巧妙的宏<好像是深入浅出mfc说的>)。
    第二:当你的类体系层次多了之后 在子类中很容易忘记你的上面那几个父类是怎么实现这个方法的,在视觉上会有些迷惑。一般来说,我们把一些功能做成接口。让我们的类是实现接口而不是从某个子类中派生。再次声明:俺只是个菜鸟,刚刚毕业入到一年,正愁着找个好公司,如果那里说的不对,希望老鸟多多指教。
      

  17.   

    看到这么多牛人,俺也来见识见识…………下面是俺的想法,有些不对,高手多多指教。声明:俺用的是.net  没用过C++面向对象来说: 类应该分级细化  但是实际应用中
    第一:每一个类的实例都回有一个指向虚方法的指针,这些虚方法需要动态调用,性能上会有点下降(俺知道.net中好像是这样子,不过俺记得mfc4.2好像是并没有用标准C++的编译器来实现多态的,而是用了一连串很巧妙的宏<好像是深入浅出mfc说的>)。
    第二:当你的类体系层次多了之后 在子类中很容易忘记你的上面那几个父类是怎么实现这个方法的,在视觉上会有些迷惑。一般来说,我们把一些功能做成接口。让我们的类是实现接口而不是从某个子类中派生。再次声明:俺只是个菜鸟,刚刚毕业入到一年,正愁着找个好公司,如果那里说的不对,希望老鸟多多指教。
      

  18.   

    MFC类比多,但是也没有烂用继承,它每一层类都有自己的作用,结构非常好。
      

  19.   

    另两个面试问题:
    1、如果一次给你很多Project,你感觉有可能不能按期完成,你将怎么做?
    2、如果给你安排的一个任务你从来没有接触过,你将怎么做前期的准备工作?
      

  20.   

    另两个面试问题:
    1、如果一次给你很多Project,你感觉有可能不能按期完成,你将怎么做?
    2、如果给你安排的一个任务你从来没有接触过,你将怎么做前期的准备工作
    ==================================================================
    1,如实向上层反映
    2,查资料,向做过的人请教
      

  21.   

    祝vcleaner 老兄早日找到满意的工作。:)
      

  22.   

    以下为我的个人看法:C++支持4种编程范型:面向过程,基于对象,面向对象和STL那样基于concept编程,使用类继承的就是基于对象和面向对象两种。
    在基于对象的情况下,无论如何继承层次不能超过三层,否则继承体系的维护将成为一件不可能的事,这既反映在函数命名冲突覆盖方面,也反映在数据成员方面。客户用到这样的类体系,一定会想要干掉写这个库的程序员^_^
    而面向对象的情况下,类继承体系应该适当地以设计模式作为建构基础,而到现在为止我遇到的设计模式没有哪个的继承层次是超过三层的。就算不考虑这个问题,我们也可以想想,当继承层次超过三层之后,很容易出现对具体类(相对于抽象类)的继承和菱形继承,这对于程序代码来说就是一场灾难,为了解决这些问题,我们于是不得不采用一些更复杂的技巧比如虚继承这样的东西。请一定为要维护你的代码的人想想,千万不要让他理解你的代码都变得不可能。至于MFC库和单根继承问题,都是争论的焦点,我水平不够,就不多说什么了。至少,MFC体系架构相对于现在的技术来说已经过时,甚至可以说变得很糟糕,这是个事实。嗯,大家嘴下留情
      

  23.   

    另两个面试问题:
    1、如果一次给你很多Project,你感觉有可能不能按期完成,你将怎么做?
    2、如果给你安排的一个任务你从来没有接触过,你将怎么做前期的准备工作
    ==================================================================
    1,据实反映,然后先做自己最熟悉的。
    2,先接触同类的产品,再向做过的人请教。
      

  24.   

    这事情没有绝对的,关键的核心在于设计。去看ACE的代码,大于3层继承的设计也不少呀。
      

  25.   

    如果有多个项目,一般是把自己做得最多最熟悉的迅速完成,再根据时间确定其他project的时间表,如果时间不充足要跟领导沟通。
    对于不熟悉的项目,还是查资料先,如果能找到类似的演示软件最好,还要跟客户充分沟通,了解他们的想法。