抛弃了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++的多继承
发布评论