前言
C++作為一門在C和Java之間的語言,其既可以使用C語言中的高效指針,又繼承了Java中的面向?qū)ο?a target="_blank">編程思想,在去年編程語言排行榜上更是首次超過Java,進(jìn)入前三。
今天這篇文章就來講解下C++中的 面向?qū)ο缶幊趟枷?/strong> 。說到面向?qū)ο缶幊?,就要講到對象的三大特性: 封裝,繼承和多態(tài) 。本篇文章就以這三個特性展開。
目錄
封裝
封裝是面向?qū)ο缶幊倘筇匦灾弧?/p>
核心思想1 :將屬性和行為作為一個整體來表現(xiàn)生活中的事物。
class People {
public:
string name;
void eat();
private:
string sex;
};
注意: 類中的屬性和行為統(tǒng)稱為成員屬性成員稱為成員變量,行為成員稱為成員函數(shù) 。
核心思想2 :對屬性和行為使用權(quán)限控制
面向?qū)ο缶幊讨械臋?quán)限包括:
- 1.public 公共權(quán)限,所有類中都可以訪問
- 2.protected 受保護(hù)權(quán)限,只有當(dāng)前類和子類可以訪問
- 3.private 私有權(quán)限,只有當(dāng)前類可以訪問。
一般封裝原則:
對所有成員變量使用private權(quán)限,并使用public成員函數(shù)set和get對成員變量進(jìn)行讀寫操作,可以防止成員變量對外暴露。
繼承
繼承是面向?qū)ο缶幊踢^程中一個很重要的特性,它允許開發(fā)者保存原有類的特性基礎(chǔ)上進(jìn)程擴展,增加功能等。 新繼承的類稱為派生類(java中習(xí)慣叫子類),而被繼承的類稱為基類(java中習(xí)慣叫父類)。
對于有java基礎(chǔ)的同學(xué)來說再熟悉不過了,所以對于Android開發(fā)者來說,對C++上手會比其他程序員更快些,雖然字面意思類似,但是C++的繼承和java還是有很多區(qū)別的,下面小余會一一道來。
繼承的格式
class 派生類名:繼承方式 基類的名稱
class A :public B
繼承基礎(chǔ)代碼:
class Father {
public:
string name = "father";
int age = 45;
};
class Son :public Father {
public:
string sex = "male";
void print() {
cout << "name:" << name << " age:" << age << " sex:" << sex << endl;
}
};
void extendsTest::mainTest()
{
Son son;
son.print();
};
打印結(jié)果:
name:father age:45 sex:male
基類中的name和age是子類和父類共有的成員變量,每個人都有名字和年齡,雖然子類中沒有定義,但是可以從父類中繼承過來,這就是繼承的意義。
而sex屬性是子類Son中獨有的成員變量。父類獨有的元素可以使用private修飾,表示這個元素屬于當(dāng)前父類持有,子類也不可獲取,這個大家都理解。
這里要說下在子類定義繼承過程中對父類的繼承方式是有說法的 :如下的public
class Son :public Father
類成員/繼承方式 | public繼承 | protected繼承 | private繼承 |
---|---|---|---|
父類的public成員 | 子類的public成員 | 子類的protected成員 | 子類private成員 |
父類的protected成員 | 子類的protected成員 | 子類的protected成員 | 子類private成員 |
父類的private成員 | 子類不可見 | 子類不可見 | 子類不可見 |
權(quán)限記住規(guī)則:
子類的權(quán)限受限于父類的權(quán)限以及子類繼承的方式,子類對父類的繼承方式只是對父類的成員進(jìn)行再封裝,大部分情況下使用public繼承方式即可。除非不想讓其他類引用該類的父類元素。
子類與父類有同名屬性或者方法
假設(shè)子類有父類同名元素,則優(yōu)先使用子類的元素
class Father {
public:
string name = "father";
int age = 45;
};
class Son :public Father {
public:
string sex = "male";
string name = "son";
void print() {
cout << "name:" << name << " age:" << age << " sex:" << sex << endl;
}
};
void extendsTest::mainTest()
{
Son son;
son.print();
};
打印結(jié)果:
name:son age:45 sex:male
如果此時一定需要訪問父類的元素呢?加上父類修飾符即可。
void print() {
cout << "name:" << Father::name << " age:" << age << " sex:" << sex << endl;
}
同名方法呢?這里就涉及到了面向?qū)ο缶幊讨械暮瘮?shù)重載多態(tài)問題了,后面再講解
單繼承和多繼承
C++中的繼承不像java中那樣,只能繼承一個父類,C++中可以繼承多個父類, 所以就有單繼承和多繼承的區(qū)別:
單繼承
只有一個父類
class A:public B{
}
多繼承
有多個父類
class A:public B,public C {
}
菱形繼承
菱形繼承圖:
菱形繼承會有啥問題呢?
class A {
public:
string name;
};
class B :public A {
public:
int age;
};
class C :public A {
public:
string sex;
};
class D :public B, public C {
public:
int id;
};
int main()
{
D student;
student.name = "小明";
student.age = 18;
student.sex = "男";
student.id = 666;
return 0;
}
問題出來了:
原因是B和C同時繼承了A,所以B和C同時都擁有name屬性,直接使用student.name,編譯器無法確定name是屬于哪個類,此時有以下解決方法:
- 方式1 :明確指明當(dāng)前name屬于哪個類
student.B::name = "小明";
- 方式2 :虛繼承:在繼承方式前加上virtual。
class B :virtual public A {
public:
int age;
};
class C :virtual public A {
public:
string sex;
};
多繼承是C++復(fù)雜的一個體現(xiàn)。有了多繼承,就存在菱形繼承,為了解決菱形繼承,又出現(xiàn)了菱形虛擬繼承,其底層實現(xiàn)又很復(fù)雜。所以 一般不建議設(shè)計出多繼承,一定不要設(shè)計出菱形繼承 。
-
JAVA
+關(guān)注
關(guān)注
19文章
2967瀏覽量
104763 -
C++
+關(guān)注
關(guān)注
22文章
2108瀏覽量
73657 -
面向?qū)ο缶幊?/span>
+關(guān)注
關(guān)注
0文章
22瀏覽量
1812
發(fā)布評論請先 登錄
相關(guān)推薦
評論