-3

是因为它非常混乱,有时字段会混杂在一起还是其他原因?它允许的是C++,但不是Java??

例如:

草食动物和肉食动物来自动物,杂食动物来自草食动物和肉食动物。所以不会有些字段混淆。

4

2 回答 2

1

为什么要避免类中的多重继承?是因为它非常混乱,有时字段会混杂在一起还是其他原因?

多重继承经常被避免,因为它会导致一些对于新手程序员来说很难解决的问题。可能出现的问题:

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

但不是在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 经常让我大吃一惊,并在实验时导致坏事。

如果您是新手,请暂时避免使用它。多重继承在我列出的场景中很有用——类支持多个不同的接口而无需编写胶水代码。在所有其他情况下,它可以避免并且可能没有必要。

如果语言有一个特性,并不意味着你必须使用这个特性。如果语言有一个名声不好的特性,并不意味着你永远不应该使用它。根据情况选择工具。

于 2013-08-26T14:15:55.683 回答
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/

于 2013-08-26T14:10:54.650 回答