C++_多继承
多继承
- 派生类只有一个基类,这种派生方法称为单基派生或单继承。
- 当一个派生类具有多个基类时,这种派生方法称为多基派生或多继承。
1. 多继承的声明
有两个以上基类的派生类声明的一般形式如下:
class 派生类名:继承方式1 基类名1,…,继承方式n
基类名n{
// 派生类新增的数据成员和成员函数
};
Class z: public x,y{
//类z公有继承了类 x, 私有继承了类y
//…
};
class z: x,public y{
//类z私有继承了类x, 公有继承了类y
//…
};
class z: public x,public y{
//类z公有继承了类x和类y
//…
};
例:多继承情况下的访问特性
#include<iostream.h>
class A {
public:
void setA(int x)
{ a=x; }
void printA()
{ cout<<"a="<<a<<endl; }
private:
int a;
};
class B {
public:
void setB(int x)
{ b=x; }
void printB()
{ cout<<"b="<<b<<endl; }
private:
int b;
};
class C: public A,private B {
public:
void setC(int x,int y){
c=x;
setB(y);
}
void printC(){
printB();
cout<<"c="<<c<<endl;
}
private:
int c;
};
void main()
{
C obj;
obj.setA(3);
obj.printA();
obj.setB(4);//错误
obj.printB();//错误
obj.setC(6,8);
obj.printC();
}
a=3
b=8
c=6
对基类成员的访问必须是无二义性
class X{
public:
int f();
};
class Y{
public:
int f();
int g();
};
class Z: public X,public Y {
public:
int g();
int h();
};
Z obj;
obj.f(); //二义性错误,不知调用的是类X的f(),还是类Y的f()。
使用类名限定可以消除二义性,例如:
obj.X∷f(); //调用类X的f()
obj.Y∷f(); //调用类Y的f()
2. 多继承的构造函数与析构函数
多继承构造函数定义的一般形式如下:
派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),…,基类名n(参数表n){
// 派生类新增成员的初始化语句
}
构造函数的执行顺序同单继承:
- 先执行基类构造函数,再执行对象成员的构造函数,最后执行派生类构造函数。
- 必须同时负责该派生类所有基类构造函数的调用。派生类的参数个数必须包含完成所有基类初始化所需的参数个数。
- 处于同一层次各基类构造函数执行顺序,取决于声明派生类时所指定各基类的顺序,与派生类构造函数中所定义的成员初始化列表的各项顺序无关。
例:多继承中的构造函数的定义方法
#include<iostream.h>
class Base1 {
public:
Base1(int sx) // 基类Base1的构造函数
{ x=sx; }
int getx()
{ return x; }
private:
int x;
};
class Base2 {
public:
Base2(int sy) // 基类Base2的构造函数
{ y=sy; }
int gety()
{ return y; }
private:
int y;
};
class Derived: public Base1,private Base2 {
public:
Derived(intsx,intsy,intsz): Base1(sx),Base2(sy)
{ z=sz; }
int getz()
{ return z; }
int gety()
{ return Base2∷gety(); }
private:
int z;
};
main(){
Derived obj(1,3,5);
int ma=obj.getx();
cout<<"x="<<ma<<endl;
int mb=obj.gety();
cout<<"y="<<mb<<endl;
int mc=obj.getz();
cout<<"z="<<mc<<endl;
return 0;
}
x=1
y=3
z=5
例
class Hard{
protected:
char bodyname[20];
public:
Hard(char *bdnm); // 基类Hard构造函数
//...
};
class Soft{
protected:
char os[10];
char Lang[15];
public:
Soft(char *o,char *lg); // 基类Soft的构造函数
//...
};
class System: public Hard,public Soft {
private:
char owner[10];
public:
System(char *ow,char *bn,char *o,char *lg): Hard(bn),Soft(o,lg); //缀上了基类Hard和Soft的构造函数
//...
};
class window { //定义窗口类window
//...
public:
window(int top,int left,int bottom,int right);
~window();
//...
};
class scrollbar{ //定义滚动条类scrollbar]
//...
public:
scrollbar(int top,int left,int bottom,int right);
~scrollbar();
//...
};
class scrollbarwind: window,scrollbar { //定义派生类
//...
public:
scrollbarwind(int top,int left,int bottom,int right);
~scrollbarwing();
//...
};
scrollbarwind∷scrollbarwind(int top,int left,int bottom,int right): window(top,left,bottom,right),scrcollbar(top,right-20,bottom,right)
{ ... }

浙公网安备 33010602011771号