是因为它非常混乱,有时字段混杂或其他原因?它允许使用C ++而不是Java?
例如:
草食动物和食肉动物来自动物,杂食动物来自食草动物和食肉动物。因此,某些领域不会混淆。答案 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)
为什么避免了类中的多重继承?是因为它非常混乱,有时字段混杂或其他原因?
通常可以避免多重继承,因为它会导致一些难以为新手程序员修复的问题。可能的问题:
~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经常会让我大吃一惊,并在实验时产生不好的结果。
如果你是新手,那么现在就避开它。多重继承在我列出的场景中很有用 - 类支持多个不同的接口而无需编写粘合代码。在所有其他情况下,可以避免,可能没有必要。
如果语言有功能,则并不意味着您必须使用此功能。 如果语言具有不良声誉的功能,并不意味着您永远不应该使用它。 根据情况选择工具。