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

面向對(duì)象的程序設(shè)計(jì)(C++)
C#入門教程之面向對(duì)象編程簡(jiǎn)介的詳細(xì)資料概述

C++語(yǔ)言和面向對(duì)象程序設(shè)計(jì)教程
STM32 C++編程系列二:STM32 C++代碼封裝初探

嵌入式C語(yǔ)言面向對(duì)象編程應(yīng)用及優(yōu)勢(shì)

C語(yǔ)言是怎么面向對(duì)象編程

評(píng)論