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)
{ ... }
posted @ 2020-02-28 00:40  鲸90830  阅读(186)  评论(0)    收藏  举报