为什么避免在类中进行多重继承?

时间:2013-08-26 13:59:17

标签: c++

是因为它非常混乱,有时字段混杂或其他原因?它允许使用C ++而不是Java?

例如:

草食动物和食肉动物来自动物,杂食动物来自食草动物和食肉动物。因此,某些领域不会混淆。

2 个答案:

答案 0 :(得分:1)

在C ++中根本无法避免。 std::iostream使用多重继承,是标准类的一部分。在不使用它的情况下编写一个非平凡的程序非常困难(想想std :: fstream或std :: stringstream)。

http://www.cplusplus.com/reference/istream/basic_iostream/ http://www.cplusplus.com/reference/fstream/basic_fstream/ http://www.cplusplus.com/reference/sstream/basic_stringstream/

答案 1 :(得分:1)

  

为什么避免了类中的多重继承?是因为它非常混乱,有时字段混杂或其他原因?

通常可以避免多重继承,因为它会导致一些难以为新手程序员修复的问题。可能的问题:

  1. Diamond inheritance.
  2. 粗心地继承多个接口(未经过精心设计)可以使用对此特定对象无用的方法污染对象的“公共”或“受保护”部分。
  3. 当对象继承其他几个对象时,您必须知道构造/销毁顺序,否则由于双删除等原因导致的未定义行为可能会导致崩溃。换句话说,如果对象C继承对象A和B,并且~A以某种方式使用对象B提供的东西,则应在~A之前调用~B。即在这种情况下,class C: public B, public A{}:将起作用,但class C: public A, public B{};将在销毁时崩溃。像这样的错误很难找到。
  4.   

    但不是Java?

    提出java问题。

      

    允许使用C ++

    C ++中提供了多重继承,因为它非常有用。

    典型场景 - 您的类必须支持几个抽象接口。让我们说“IReader”,“IWriter”和“IUglyObject”。哪个没有共同的祖先。 要支持几个没有多重继承的接口,你要么必须确保所有接口都有共同的祖先(这并不总是可行),要么你必须定义额外的类(从你想要支持的接口派生),写很多胶水代码将你的类调用转发到派生类,这太多了。使用多重继承,您可以简单地保护继承所有接口,并添加几个返回指向所需接口的指针的方法。

    class MyClass: protected ISomething, protected ISomethingElse{
    public:
        ISomething* getSomethingInterface(){ return this;}
        ISomethingElse* getSomethingEkseInterface(){ return this;}
    protected:
    };
    
      草食动物和食肉动物来自动物,杂食动物来自食草动物和食肉动物。因此,某些领域不会混淆。

    设计层次结构的方法有很多种,本例中使用的方法并不完美。例如,我可以抽象“饮食行为”类并将其存储在“动物”中。这将允许我在飞行中改变动物行为并暂时转变兔子食肉动物。或者我可以创建虚拟方法,返回动物接受的食物类型列表(或测试食物是否被这种动物接受),这将允许我制作想要只吃煎蛋而没有其他东西的动物。还有其他方法。

    类层次结构不必模仿真实世界,你知道......

      

    当我还在学习C ++时,MI经常会让我大吃一惊,并在实验时产生不好的结果。

    如果你是新手,那么现在就避开它。多重继承在我列出的场景中很有用 - 类支持多个不同的接口而无需编写粘合代码。在所有其他情况下,可以避免,可能没有必要。

    如果语言有功能,则并不意味着您必须使用此功能。 如果语言具有不良声誉的功能,并不意味着您永远不应该使用它。 根据情况选择工具。