c++第四次做業

繼承與派生

知識要點

1.關於繼承、派生

類的繼承, 是新的類從已有類那裏獲得已有的特性。簡單來講,就是在原有類的基礎上作一些擴充。
定義方式:
ios

class 派生類名:繼承方式 基類名1,繼承方式 基類名...
{
   派生類成員聲明; /*對除了從基類繼承來的成員以外,新增長的數據和函數成員的聲明*/
};

例子函數

class person//定義一個person類
{
    string name[6];
    int age;
    char sex;
};
class student:public person/*定義student類,公有繼承person類,那麼student裏面也有name、age、sex*/
{
    int id;
    int score;
};

[attention]在派生過程當中構造函數和析構函數都不被繼承
沒有指明繼承方式時默認private
this

2.三種繼承方式

公有繼承(public):基類的公有成員和保護成員在派生類中的訪問屬性不變,而基類的私有成員不可直接訪問
私有繼承(private):基類的公有成員和保護成員以私有成員身份出如今派生類中,而基類的私有成員在派生類中不可直接訪問
保護繼承(protected):基類的公有成員和保護成員以保護成員身份出如今派生類中,而基類的私有成員在派生類中不可直接訪問

---
呈現以下spa

繼承方式 子類訪問權限 類外對象訪問權限
public 能夠訪問public、protected 能夠訪問public
private 能夠訪問public、protected 沒法訪問
protected 能夠訪問public、protected 沒法訪問

具體例子code

#include"pch.h"
#include<iostream>
using namespace std;
class Point
{
public:
    int getX()
    {
        return x;
    }
    int getY()
    {
        return y;
    }
protected:
    void initial(int xx, int yy);
private:
    int x, y;
};
void Point::initial(int xx, int yy)
{
    x = xx;
    y = yy;
}
class Rectangle:public Point/*此處爲公有繼承,稍後會對繼承方式進行改動*/
{
public:
    int getWidth()
    {
        return width;
    }
    int getLength()
    {
        return length;
    }
    void initial_1(int length, int width, int x, int y)
    {
        initial(x, y);//此處代表公有繼承在派生類中能夠訪問基類的protected
        this->length = length;
        this->width = width;
    }
private:
    int length, width;
};
int main()
{
    Rectangle rec;
    rec.initial_1(3, 2, 9, 5);//訪問基類的保護成員
    cout << rec.getLength()<<endl;
    cout << rec.getX();//訪問基類的公有成員
    return 0;
}

對於公有繼承在類外的訪問
對象

對於私有和保護繼承在類外的訪問
blog

3.派生類的構造函數與析構函數

構造派生類的對象時,須要對基類的成員對象和新增成員對象進行初始化。但在繼承的過程當中,基類的構造函數不被繼承,因此派生類的構造函數中的一些參數就須要傳給基類的構造函數。
通常語法形式
繼承

派生類名::派生類名(參數表):基類名1(基類1初始化參數表),...,基類名n(初始化n參數表)
{
    派生類構造函數的其餘初始化操做;
}

派生類構造函數執行的通常次序:

(1)調用基類構造函數,調用順序按照他們被繼承時聲明的順序
(2)對派生類新增的成員對象初始化時,調用順序按照他們在類中聲明的順序
(3)執行派生類構造函數體中的內容
get

#include"pch.h"
#include<iostream>
using namespace std;
class A
{
public:A(int i)//有參數的構造函數
{
    cout << "constructing A " << i << endl;
}
};
class B
{
public:B(int j)//有參數的構造函數
{
    cout << "constructing B " << j << endl;
}
};
class C
{
public:C()//無參數的構造函數
{
    cout << "constructing C* " << endl;
}
};
class D :public A, public B, public C//公有繼承
{
public:D(int a,int b,int c,int d):A(a),m1(d),m2(c),B(b)
{}
private:A m1;
        B m2 ;
        C m3;
};
int main()
{
    D d(1, 2, 3, 4);
    return 0;
}

構造代碼結果
string

4.虛基類

聲明語法形式

class 派生類名:virtual 繼承方式 基類名

以實例來講明

#include"pch.h"
#include<iostream>
using namespace std;
class A
{
public:
    int a;
    void funa()
    {
        cout << "member of A" << endl;
    }
};
class B:virtual public A//以A爲虛基類
{
public:
    int b;
};
class C :virtual public A//以A爲虛基類
{
public:
    int c;
};
class D :public B, public C//D是B和C,以A爲虛基類派生的
{
public:
    int d;
    void fun()
    {
        cout << "member of D" << endl;
    }
};
int main()
{
    D d;
    //直接訪問虛基類的數據成員和函數成員
    d.a = 2;
    d.funa();
    return 0;

}

虛基類代碼結果

相關文章
相關標籤/搜索