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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

前言

C++作為一門在C和Java之間的語言,其既可以使用C語言中的高效指針,又繼承了Java中的面向對象編程思想,在去年編程語言排行榜上更是首次超過Java,進入前三。

今天這篇文章就來講解下C++中的 面向對象編程思想 。說到面向對象編程,就要講到對象的三大特性: 封裝,繼承和多態(tài) 。本篇文章就以這三個特性展開。

目錄

封裝

封裝是面向對象編程三大特性之一。

核心思想1 :將屬性和行為作為一個整體來表現生活中的事物。

class People {
public:
    string name;
    void eat();
privatestring sex;
};

注意: 類中的屬性和行為統稱為成員屬性成員稱為成員變量,行為成員稱為成員函數 。

核心思想2 :對屬性和行為使用權限控制

面向對象編程中的權限包括:

  • 1.public 公共權限,所有類中都可以訪問
  • 2.protected 受保護權限,只有當前類和子類可以訪問
  • 3.private 私有權限,只有當前類可以訪問。

一般封裝原則:

對所有成員變量使用private權限,并使用public成員函數set和get對成員變量進行讀寫操作,可以防止成員變量對外暴露。

繼承

繼承是面向對象編程過程中一個很重要的特性,它允許開發(fā)者保存原有類的特性基礎上進程擴展,增加功能等。 新繼承的類稱為派生類(java中習慣叫子類),而被繼承的類稱為基類(java中習慣叫父類)。

對于有java基礎的同學來說再熟悉不過了,所以對于Android開發(fā)者來說,對C++上手會比其他程序員更快些,雖然字面意思類似,但是C++的繼承和java還是有很多區(qū)別的,下面小余會一一道來。

繼承的格式

class 派生類名:繼承方式 基類的名稱
class A :public B

繼承基礎代碼:

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();
};
打印結果:
name:father age:45 sex:male

基類中的name和age是子類和父類共有的成員變量,每個人都有名字和年齡,雖然子類中沒有定義,但是可以從父類中繼承過來,這就是繼承的意義。

而sex屬性是子類Son中獨有的成員變量。父類獨有的元素可以使用private修飾,表示這個元素屬于當前父類持有,子類也不可獲取,這個大家都理解。

這里要說下在子類定義繼承過程中對父類的繼承方式是有說法的 :如下的public

class Son :public Father
類成員/繼承方式 public繼承 protected繼承 private繼承
父類的public成員 子類的public成員 子類的protected成員 子類private成員
父類的protected成員 子類的protected成員 子類的protected成員 子類private成員
父類的private成員 子類不可見 子類不可見 子類不可見

權限記住規(guī)則:

子類的權限受限于父類的權限以及子類繼承的方式,子類對父類的繼承方式只是對父類的成員進行再封裝,大部分情況下使用public繼承方式即可。除非不想讓其他類引用該類的父類元素。

子類與父類有同名屬性或者方法

假設子類有父類同名元素,則優(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();
};

打印結果:
name:son age:45 sex:male

如果此時一定需要訪問父類的元素呢?加上父類修飾符即可。

void print() {
    cout << "name:" << Father::name << " age:" << age << " sex:" << sex << endl;
}

同名方法呢?這里就涉及到了面向對象編程中的函數重載多態(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 :明確指明當前name屬于哪個類
student.B::name = "小明";
  • 方式2 :虛繼承:在繼承方式前加上virtual。
class B :virtual  public A {
public:
    int age;
};
class C :virtual public A {
public:
    string sex;
};

多繼承是C++復雜的一個體現。有了多繼承,就存在菱形繼承,為了解決菱形繼承,又出現了菱形虛擬繼承,其底層實現又很復雜。所以 一般不建議設計出多繼承,一定不要設計出菱形繼承 。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2943

    瀏覽量

    104096
  • C++
    C++
    +關注

    關注

    21

    文章

    2085

    瀏覽量

    73302
  • 面向對象編程

    關注

    0

    文章

    22

    瀏覽量

    1797
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

    C++課件

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

    Visual C++面向對象與可視化程序設計習題解析與編程

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

    C++編程思想

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

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

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

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

    本文檔的主要內容詳細介紹的是C#入門教程之面向對象編程簡介的詳細資料概述主要學習的目標是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>簡介的詳細資料概述

    C++語言和面向對象程序設計教程

    C++語言和面向對象程序設計代表了旨在使計算機問題解更加符合人的思維活動,是軟件開發(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ōu)勢

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

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

    在嵌入式開發(fā)中,C/C++語言是使用最普及的,在C++11版本之前,它們的語法是比較相似的,只不過C++提供了面向
    的頭像 發(fā)表于 02-14 13:57 ?1504次閱讀
    <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 ?501次閱讀
    <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 ?475次閱讀
    <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語言是一種面向過程的語言,但是也可以用結構體和函數指針來模擬面向對象的特性,比如封裝、繼承和多態(tài)。
    發(fā)表于 11-02 12:27 ?789次閱讀