这几天又从新看了一下派生类的,对派生类做了一下总结,愿和友友们一起分享一下,如有不正确的地方希望指证。从继承源上分有单继承和多继承:单继承大家都很熟悉了,主要谈一下多继承(一)多继承的方式: class <派生类名> :<派生方式1> <基类1>, <派生方式2> <基类2>, ... ... { //派生类的内容 }; 其中 派生方式1 ,派生方式2 ... ...可以是public,private,protected中的任意方式,如: class A{ public: int x; void set(int a);}; class B{ public: int x; void set(int a); }; class C :public A, public B{ public: int y; int get() { return x*y; } }; 其中派生类C公有继承基类A和B,所以对于单个的C和A、C和B之间的关系和单继承一样 (二)二义性 (1)在多继承的派生方式时,又是会产生二义性的问题,如上面的例子,派生类C分别公有继承基类A和B,所以C可以使用基类A和B的公有数据和公有函数,像派生类C中的get函数在调用x时,编译器并不知道是在调用基类A中的公有数据x,还是调用基类B中的公有数据x,这样就会产生二义性。 同时,在基类A中和基类B中如果有相同的公有函数,而在派生类中并没有重新定义该函数时,如: C c1; c1.set(2); //error 编译器并不知道是在调用哪个基类中的set函数,如下调用是正确的 c1.A::set(2); //ok c1.B::set(2); //ok (2)另外还有一种可能会产生二义性问题,当派生类继承的多个基类中有一些基类又是同一基类的派生类时,也会产生二义性问题,如: class A{ public: int x; }; class B1:public A{ ... ...}; class B2: public A{ ... ...}; class C :public B1, public B2{ public: void set(int a) { x = a; //error A::x = a; //error }}; 这样在派生类中想用x时,这样两种方式是错误的,因为基类B1和B2都继承于类A,他们中都用x使得编译器并不知道是调用的是哪个基类的,应该为一下两种方式: B1::x = a; B2::x = a;以上是自己对多继承的一些理解,或许有些不准确的地方,希望大家多多指教,并且不断追加其内容。(看完后不要忘了顶呀,谢谢)
|