【Java】浅析Java为何抛弃了C++的多继承

编程入门 行业动态 更新时间:2024-10-24 06:31:34

【Java】浅析Java为何<a href=https://www.elefans.com/category/jswz/34/1055227.html style=抛弃了C++的多继承"/>

【Java】浅析Java为何抛弃了C++的多继承

当初学C++继承的时候,一开始确实被里面乱七八糟的关系弄的晕得不轻。单继承、多继承、虚继承.....Ծ‸Ծ

当时好像听过一句话:“等你学Java的时候就好了,Java把这些东西都扔了” 罒ω罒//偷笑.jpg

为什么会丢弃这些东西嘞?往下看:

#include<iostream>   //错误代码
using namespace std;
class A{public:int a=1;void ex(){cout<<"This is A"<<endl;}
}; 
class B:public A{public:void f(){cout<<"This is B"<<endl;}
};
class C:public A{public:void f(){cout<<"This is C"<<endl;}
};
class D:public B,public C{void ee(){cout<<"this is D"<<endl;}
};
int main(){D d;cout<<d.a<<endl;
//    d.B::f();cin.get();return 0;
}

这是一个关于多重继承的小例子,如图:

这里编译时会显示出错:

 

出错原因是因为,系统不知道这个a,是D去继承,B继承A而来的还是C继承A而来的(二义性)。因为D通过继承B、C带来了两个

A的副本。这里可以通过改写成:

int main(){D d;cout<<d.B::a<<endl;  //指定这是访问d继承B从A继承来的areturn 0;
}

来更正(很鸡肋对吧)

当然,也可以用虚继承去解决这个问题(让D里面只保留一个A的副本)(B、C继承A时加上virtual,声明这是虚继承):

#include<iostream>
using namespace std;
class A{public:int a=1;void ex(){cout<<"This is A"<<endl;}
}; 
class B:virtual public A{public:void f(){cout<<"This is B"<<endl;}
};
class C:virtual public A{public:void f(){cout<<"This is C"<<endl;}
};
class D:public B,public C{void ee(){cout<<"this is D"<<endl;}
};
int main(){D d;cout<<d.a<<endl;
//    d.B::f();cin.get();return 0;
}

以上就是多继承中的菱形继承问题,用virtual解决之后就完了?没辣么简单。

如果B和C中都有一个函数f( ),直接写d.f()还是会报错,因为机子又不知道这个f()哪来的了((~ ̄(OO) ̄)ブ)

还是二义性问题:

还是一样,改写main函数,可以更正过来:

int main(){D d;d.B::f();   //指定这是d调用B的f()return 0;
}

 总结:多继承的实用性不强,并且多继承中错综复杂的关系降低了程序的容错率。

这也许就是Java将其抛弃之的原因吧(罒ω罒)

另一方面,Java也提出了Interface(接口)的概念,借以弥补多继承的功能。

更多推荐

【Java】浅析Java为何抛弃了C++的多继承

本文发布于:2024-02-06 15:35:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1750150.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:抛弃了   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!