多重继承就是派生类继承多个基类,继承方法和一个继承是一样的。
一个继承请看我 —> “C++ 继承和派生” 文章,会有详细介绍。
链接: C++ 继承和派生
在这里我主要讲多重继承的细节。
第一
继承方法:
例如已声明了类A、类B和类C,那么可以这样来声明派生类D:
class D: public A, private B, protected C{
//...
};
D 是多继承形式的派生类,
D 有3个父类(基类)
它以公有的方式继承 A 类,
以私有的方式继承 B 类,
以保护的方式继承 C 类。
D 根据不同的继承方式获取 A、B、C 中的成员.
第二
派生类中的构造函数:
以上面的 A、B、C、D 类为例,D 类构造函数的写法为:
D(形参列表): A(实参列表), B(实参列表), C(实参列表){
//...
}
注意:
如果A,B,C基类中,都包含数据成员name,那么派生类D都会将他们继承下来。
在自己的构造函数中为他们赋值的话,他们属于不同的内存,所以都可以赋值,不会起冲突。
D(const char *name): A(name), B(name), C(name) {
//...
}
=
=
多继承的构造函数的调用顺序:
基类构造函数的调用顺序和和它们在派生类构造函数中出现的顺序无关,
而是和声明派生类时基类出现的顺序相同。
例:
class D: public A, private B, protected C{
//...
};
调用构造函数的顺序是:A, B, C
=
=
=
补充:
多重继承的弊端: 二义性[多重继承的钻石问题]假如基类A,B,C都有一个成员函数play(),派生类D继承他们后,同时也会把他们三个的paly()方法都继承过来。
当D类的对象去调用play()这个方法就会出错,因为编译器完全不知要调用哪个。
例:
class A {
public:
void play() {cout << "玩王者荣耀" << endl;}
};
class B {
public:
void play() {cout << "玩和平精英" << endl;}
};
class B {
public:
void play() {cout << "玩QQ飞车" << endl;}
};
class D : public A, public B, public C {
public:
//...
};
int main(void) {
D d;
d.play(); // 错误,编译器不知道该调用谁的play()方法
return 0;
}
=
=
以上这种二义性的问题有两个解决方法:
第一,指明类去调用:
int main(void) {
D d;
d.A::play();
d.B::play(); // 要使用哪个类的play()方法就指明哪个类
d.C::play();
return 0;
}
第二,自己类中建一个:
class A {
public:
void play() {cout << "玩王者荣耀" << endl;}
};
class B {
public:
void play() {cout << "玩和平精英" << endl;}
};
class B {
public:
void play() {cout << "玩QQ飞车" << endl;}
};
class D : public A, public B, public C {
public:
void play() {
A::play();
B::play(); // 需要调用谁的就写下来
C::play();
}
};
这样子调用,就会调用到自己定义的play()方法了,使代码更简明,简介
int main(void) {
D d;
d.play(); // 调用自己的play()方法
return 0;
}