0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C/C++之面向?qū)ο缶幊趟枷?

jf_78858299 ? 來源:小余的自習(xí)室 ? 作者:小余的自習(xí)室 ? 2023-03-30 15:14 ? 次閱讀

前言

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();
privatestring 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 Apublic 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è)計出菱形繼承 。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦

    Labview 之面向對象編程。 里面有個例子 和視頻教程地址

    Labview 之面向對象編程。 里面有個例子 和視頻教程地址Labview 之面向對象編程
    發(fā)表于 12-29 10:16

    C++ 面向對象多線程編程下載

    C++ 面向對象多線程編程下載
    發(fā)表于 04-08 02:14 ?70次下載

    C++面向對象多線程編程 (pdf電子版)

    C++面向對象多線程編程共分13章,全面講解構(gòu)建多線程架構(gòu)與增量多線程編程技術(shù)。第1章介紹了
    發(fā)表于 09-25 09:39 ?0次下載

    C++課件

     C++面向對象程序設(shè)計 面向對象思想的由來面向
    發(fā)表于 04-10 13:41 ?0次下載

    Visual C++面向對象與可視化程序設(shè)計習(xí)題解析與編程

    Visual C++面向對象與可視化程序設(shè)計習(xí)題解析與編程實例從最基本的概念出發(fā),詳細(xì)地講述了使用Visual C++進(jìn)行
    發(fā)表于 07-12 15:16 ?0次下載
    Visual <b class='flag-5'>C++</b><b class='flag-5'>面向</b><b class='flag-5'>對象</b>與可視化程序設(shè)計習(xí)題解析與<b class='flag-5'>編程</b>實

    C++編程思想

    C++編程思想,很好的資料,大家下載看看吧!夠20字了吧,哈哈哈!
    發(fā)表于 11-17 11:38 ?0次下載

    面向對象的程序設(shè)計(C++

    面向對象的程序設(shè)計(C++).面向對象的基本思想 C++
    發(fā)表于 03-22 14:40 ?0次下載

    C#入門教程之面向對象編程簡介的詳細(xì)資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是C#入門教程之面向對象編程簡介的詳細(xì)資料概述主要學(xué)習(xí)的目標(biāo)是1.面向
    發(fā)表于 12-05 11:54 ?35次下載
    <b class='flag-5'>C</b>#入門教程<b class='flag-5'>之面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b>簡介的詳細(xì)資料概述

    C++語言和面向對象程序設(shè)計教程

    C++語言和面向對象程序設(shè)計代表了旨在使計算機問題解更加符合人的思維活動,是軟件開發(fā)方法的一場革命;面向對象建模和
    發(fā)表于 03-02 08:00 ?6次下載

    STM32 C++編程系列二:STM32 C++代碼封裝初探

    一、STM32與面向對象編程上一章中提到了,C++的核心之一就在于面向對象
    發(fā)表于 12-08 11:06 ?13次下載
    STM32 <b class='flag-5'>C++</b><b class='flag-5'>編程</b>系列二:STM32 <b class='flag-5'>C++</b>代碼封裝初探

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

    既然面向對象是一種編程思想,而編程語言只是一種工具,那么,思想與工具之間就不存在一種強耦合的關(guān)系
    發(fā)表于 11-10 12:00 ?1786次閱讀
    嵌入式<b class='flag-5'>C</b>語言<b class='flag-5'>面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b>應(yīng)用及優(yōu)勢

    C語言是怎么面向對象編程

    在嵌入式開發(fā)中,C/C++語言是使用最普及的,在C++11版本之前,它們的語法是比較相似的,只不過C++提供了面向
    的頭像 發(fā)表于 02-14 13:57 ?1682次閱讀
    <b class='flag-5'>C</b>語言是怎么<b class='flag-5'>面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b>

    C/C++之面向對象編程思想2

    C++作為一門在C和Java之間的語言,其既可以使用C語言中的高效指針,又繼承了Java中的面向對象編程
    的頭像 發(fā)表于 03-30 15:14 ?582次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>之面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b><b class='flag-5'>思想</b>2

    C/C++之面向對象編程思想3

    C++作為一門在C和Java之間的語言,其既可以使用C語言中的高效指針,又繼承了Java中的面向對象編程
    的頭像 發(fā)表于 03-30 15:16 ?568次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>之面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b><b class='flag-5'>思想</b>3

    淺談C語言面向對象編程思想

    C語言是一種面向過程的語言,但是也可以用結(jié)構(gòu)體和函數(shù)指針來模擬面向對象的特性,比如封裝、繼承和多態(tài)。
    發(fā)表于 11-02 12:27 ?1118次閱讀