当初学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继承来的a
    return 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(接口)的概念,借以弥补多继承的功能。