C++ Notes-Inheritance-02
來(lái)源:程序員人生 發(fā)布時(shí)間:2016-11-19 14:50:18 閱讀次數(shù):2435次
繼承方式
1、繼承方式簡(jiǎn)介
1、不同的繼承方式的影響主要體現(xiàn)在:
(1)派生類(lèi)成員對(duì)其基類(lèi)成員的訪問(wèn)權(quán)限
(2)通過(guò)派生類(lèi)對(duì)象對(duì)基類(lèi)成員的訪問(wèn)權(quán)限
2、3種繼承方式
(1)公有繼承(public)
(2)私有繼承(private)
(3)保護(hù)繼承(protected)
2、公有繼承(public)
1、繼承的訪問(wèn)控制
(1)基類(lèi)的public和protected成員:訪問(wèn)屬性在派生類(lèi)中保持不變
(2)基類(lèi)的private成員:不可直接訪問(wèn)
2、訪問(wèn)權(quán)限
(1)派生類(lèi)中的成員函數(shù):可以直接訪問(wèn)基類(lèi)中的public和protected成員,但不能直接訪問(wèn)基類(lèi)的private成員
(2)通過(guò)派生類(lèi)的對(duì)象:只能訪問(wèn)public成員
3、Code
#include <iostream>
#include <cmath>
using namespace std;
class Point { //基類(lèi)Point類(lèi)的定義
public: //公有函數(shù)成員
void initPoint(float x = 0, float y = 0)
{
this->x = x;
this->y = y;
}
void move(float offX, float offY)
{
x += offX;
y += offY;
}
float getX() const { return x; }
float getY() const { return y; }
private: //私有數(shù)據(jù)成員
float x, y;
};
class Rectangle: public Point { //派生類(lèi)定義部份
public: //新增公有函數(shù)成員
void initRectangle(float x, float y, float w, float h)
{
initPoint(x, y); //調(diào)用基類(lèi)公有成員函數(shù)
this->w = w;
this->h = h;
}
float getH() const { return h; }
float getW() const { return w; }
private: //新增私有數(shù)據(jù)成員
float w, h;
};
int main() {
Rectangle rect; //定義Rectangle類(lèi)的對(duì)象
rect.initRectangle(2, 3, 20, 10); //設(shè)置矩形的數(shù)據(jù)
rect.move(3,2); //移動(dòng)矩形位置
cout << "The data of rect(x,y,w,h): " << endl; //輸出矩形的特點(diǎn)參數(shù)
cout << rect.getX() <<", "<< rect.getY() << ", "<< rect.getW() << ", "<< rect.getH() << endl;
return 0;
}
3、私有繼承(private)
1、繼承的訪問(wèn)控制
(1)基類(lèi)的public和protected成員:都以private的身份出現(xiàn)在派生類(lèi)中
(2)基類(lèi)的private成員:不可直接訪問(wèn)
2、訪問(wèn)權(quán)限
(1)派生類(lèi)中的成員函數(shù):可以直接訪問(wèn)基類(lèi)中的public和protected成員,但不能直接訪問(wèn)基類(lèi)的private成員
(2)通過(guò)派生類(lèi)的對(duì)象:不能直接訪問(wèn)從基類(lèi)繼承的任何成員
3、Code
值得注意的是,基類(lèi)中的move函數(shù)通過(guò)私有繼承到派生類(lèi)后,是不能在類(lèi)外使用的,如果要在類(lèi)外使用,可以在派生類(lèi)的public下重寫(xiě)1個(gè)move函數(shù),這樣在類(lèi)外就能夠調(diào)用了。
#include <iostream>
#include <cmath>
using namespace std;
class Point { //基類(lèi)Point類(lèi)的定義
public: //公有函數(shù)成員
void initPoint(float x = 0, float y = 0)
{
this->x = x;
this->y = y;
}
void move(float offX, float offY)
{
x += offX;
y += offY;
}
float getX() const { return x; }
float getY() const { return y; }
private: //私有數(shù)據(jù)成員
float x, y;
};
class Rectangle: private Point { //派生類(lèi)定義部份
public: //新增公有函數(shù)成員
void initRectangle(float x, float y, float w, float h) {
initPoint(x, y); //調(diào)用基類(lèi)公有成員函數(shù)
this->w = w;
this->h = h;
}
void move(float offX, float offY) //雖然對(duì)象不能在類(lèi)外使用基類(lèi)的move函數(shù),但是在派生類(lèi)中可使用基類(lèi)的move函數(shù)
{
Point::move(offX, offY);
}
float getX() const { return Point::getX(); }
float getY() const { return Point::getY(); }
float getH() const { return h; }
float getW() const { return w; }
private: //新增私有數(shù)據(jù)成員
float w, h;
};
int main() {
Rectangle rect; //定義Rectangle類(lèi)的對(duì)象
rect.initRectangle(2, 3, 20, 10); //設(shè)置矩形的數(shù)據(jù)
rect.move(3,2); //移動(dòng)矩形位置,要注意此時(shí)的move函數(shù)是派生類(lèi)Rectangle中的成員函數(shù)
cout << "The data of rect(x,y,w,h): " << endl; //輸出矩形的特點(diǎn)參數(shù)
cout << rect.getX() <<", "<< rect.getY() << ", "<< rect.getW() << ", "<< rect.getH() << endl;
return 0;
}
4、保護(hù)繼承(protected)
1、繼承的訪問(wèn)控制
(1)基類(lèi)的public和protected成員:都以protected的身份出現(xiàn)在派生類(lèi)中
(2)基類(lèi)的private成員:不可直接訪問(wèn)
2、訪問(wèn)權(quán)限
(1)派生類(lèi)中的成員函數(shù):可以直接訪問(wèn)基類(lèi)中的public和protected成員,但不能直接訪問(wèn)基類(lèi)的private成員
(2)通過(guò)派生類(lèi)的對(duì)象:不能直接訪問(wèn)從基類(lèi)繼承的任何成員
3、protected 成員的特點(diǎn)與作用
(1)對(duì)建立其所在類(lèi)對(duì)象的模塊來(lái)講,它與private成員的性質(zhì)相同
(2)對(duì)其派生類(lèi)來(lái)講,它與public性質(zhì)相同
(3)既實(shí)現(xiàn)了數(shù)據(jù)隱藏,又方便繼承,實(shí)現(xiàn)代碼重用
4、protected用處
如果代碼是同1組,同1個(gè)團(tuán)隊(duì)內(nèi)的人寫(xiě)的,那末我們可以繼承使用基類(lèi)protected的細(xì)節(jié)。但是如果不是同1組人寫(xiě)的,或是買(mǎi)的類(lèi)庫(kù),那末使用protected的細(xì)節(jié)就不是那末方便了。
5、Code
class A {
protected:
int x;
};
int main() {
A a;
a.x = 5;//毛病
}
class A {
protected:
int x;
};
class B: public A{
public:
void function();
};
void B:function() {
x = 5; //正確
}
5、多繼承
如果派生類(lèi)有多個(gè)基類(lèi),也就是多繼承,可以用不同的方式繼承每一個(gè)基類(lèi)。
Code:
class A {
public:
void setA(int x){ a=x; }
void showA() const{cout<<a<<endl;};
private:
int a;
};
class B {
public:
void setB(int x){ b=x; }
void showB() const{cout<<b<<endl;};
private:
int b;
};
class C : public A, private B {
public:
void setC(int x, int y, int z)
{ //派生類(lèi)成員直接訪問(wèn)基類(lèi)的公有成員
setA(x);
setB(y);
c = z;
}
void showC() const{cout<<c<<endl;};
private:
int c;
};
int main() {
C obj;
obj.setA(5);
obj.showA();
obj.setC(6,7,9);
obj.showC();
// obj.setB(6); 毛病
// obj.showB(); 毛病
return 0;
}
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)