溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言面向?qū)ο缶幊讨械姆庋b是什么

發(fā)布時(shí)間:2022-03-17 09:04:51 來(lái)源:億速云 閱讀:236 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“C語(yǔ)言面向?qū)ο缶幊讨械姆庋b是什么”,在日常操作中,相信很多人在C語(yǔ)言面向?qū)ο缶幊讨械姆庋b是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C語(yǔ)言面向?qū)ο缶幊讨械姆庋b是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

一、面向?qū)ο蠡靖拍?/h3>

什么是對(duì)象?

此對(duì)象非彼對(duì)象,雖然有時(shí)候此對(duì)象又可以是你腦袋中的對(duì)象,那讓我們從我們誤解的對(duì)象開(kāi)始了解吧,雖然我沒(méi)有,但是用一下自己的直男思維,想想一個(gè)對(duì)象也是可以滴。那我就進(jìn)入一下我這個(gè)直男腦袋中的對(duì)象吧!我有一個(gè)對(duì)象,這個(gè)對(duì)象呢,膚白貌美大長(zhǎng)腿。用詩(shī)中的話就是“皓腕凝霜雪,壚邊人似月”,美麗的江南女子,誰(shuí)不喜歡呢。既然是想象,對(duì)象不只是僅僅是膚白貌美大長(zhǎng)腿,還得愛(ài)你,在你寂寞的時(shí)候能陪你,在你難過(guò)時(shí)能在你身邊,在你打游戲的時(shí)候不會(huì)無(wú)理取鬧。這樣的對(duì)象多好哇,簡(jiǎn)直就是夢(mèng)中情人,可惜只存在想想中(嘆氣)。

通過(guò)上面的例子,想象中的對(duì)象,它具有了對(duì)象的特征,是不算非常符合人類的特性,易懂。那讓我們從上面的例子提取出來(lái)對(duì)象的普遍特征。

特征一:屬性

讓我們回到我想象中的對(duì)象,對(duì)象是怎樣的,皓腕凝霜雪,壚邊人似月,這個(gè)是對(duì)象的屬性,也就是樣子。當(dāng)然屬性不只是樣子啦,你可以添加更多的屬性,比如聲音好聽(tīng),年齡20歲等等。

特征二:行為

對(duì)象具有的動(dòng)作就是行為。在上面的例子就是,對(duì)象非常愛(ài)你,難過(guò)的時(shí)候能陪你,寂寞的時(shí)候也能陪你等等,就是這個(gè)對(duì)象具有的動(dòng)作,對(duì)象能干什么。

對(duì)象與類

我們知道了對(duì)象是什么,但是你有沒(méi)有發(fā)現(xiàn)這個(gè)對(duì)象是很廣泛的,也就是我想象中的對(duì)象不知有一個(gè),符合我想象中對(duì)象的特征可以多個(gè),也就是我可以想象又很多個(gè)對(duì)象。我可以想象有”后宮佳麗三千人“,這三個(gè)都符合我對(duì)象的特征。這些特征就是類,也就是符合我想象的人不只是只有一個(gè),可以有多個(gè),只要這個(gè)人符合我想象的特征,她就是在這個(gè)類下面的。

那么類與對(duì)象的關(guān)系又是怎樣的?對(duì)象就是符合這個(gè)類的特例,怎么理解呢?

在我的想象中,符合大美女的屬性有很多,但是我不知道具體是誰(shuí),但是有一天我在動(dòng)漫中看見(jiàn)了這個(gè)人,她叫小A。小A就是在大美女類下面的一個(gè)對(duì)象。又有一天,我又碰到一個(gè)人,也符合我定義的大美女,這個(gè)對(duì)象,她叫小B。小A和小B都是符合定義的,也就是在這個(gè)類下面的,而小A和小B是一個(gè)特例,也就是這個(gè)類下面的人,是獨(dú)一無(wú)二的。

面向?qū)ο蟮木幊谭绞?/h4>

老生常談,先簡(jiǎn)單看看面向過(guò)程的編程方式是怎樣的?設(shè)想一個(gè)場(chǎng)景,刺激點(diǎn)的。有一天杰哥想你了,打算和你回家一起打電動(dòng),那他該怎么做才能邀請(qǐng)到你回家一起打電動(dòng)?

面向過(guò)程的解決方式:簡(jiǎn)單點(diǎn)的方式簡(jiǎn)化一下

1:他首先西裝革履,打扮的人模狗樣,看起來(lái)十分帥氣,小姐姐看了表示很贊

2:打車到你家

3:盛情邀約

面向?qū)ο蟮慕鉀Q方式又是怎樣的呢:我們看他邀請(qǐng)你涉及幾個(gè)對(duì)象,打車對(duì)象,邀請(qǐng)對(duì)象,打電動(dòng)對(duì)象,回家對(duì)象。那對(duì)象是怎么做的呢?那讓我們看一下執(zhí)行順序:杰哥首先調(diào)用了打扮的對(duì)象進(jìn)行了打扮,然后調(diào)用打車對(duì)象去了你家。到了你家后調(diào)用了邀請(qǐng)對(duì)象的行為發(fā)出了邀請(qǐng),然后你調(diào)用了邀請(qǐng)對(duì)象的行為拒絕了杰哥,杰哥調(diào)用了情緒的對(duì)象的行為,發(fā)出了很難過(guò)的感覺(jué)。

打扮對(duì)象:

  • 行為:打扮

打車對(duì)象:

  • 屬性:打車人

  • 屬性:打車地點(diǎn)

  • 行為:上車

邀請(qǐng)對(duì)象:

  • 屬性:邀請(qǐng)人

  • 屬性:邀請(qǐng)結(jié)果

  • 行為1:接受

  • 行為2:拒絕

  • 行為3:發(fā)出邀請(qǐng)

回家對(duì)象:

  • 屬性:回家的路

  • 屬性:回家的時(shí)間

  • 行為:回家

情緒:

  • 屬性:程度

  • 行為1:傷心

  • 行為2:難過(guò)

  • 行為3:非常難過(guò)

通過(guò)上面的例子,大概了解到了與面向過(guò)程的區(qū)別了,面向?qū)ο蟮木幊谭绞降膯卧菍?duì)象,做了什么事情也是以對(duì)象執(zhí)行動(dòng)作。對(duì)象可以被很多對(duì)象調(diào)用,杰哥可以調(diào)用邀請(qǐng)對(duì)象中的邀請(qǐng)行為,你也可以調(diào)用邀請(qǐng)對(duì)象發(fā)出拒絕邀請(qǐng)的動(dòng)作。對(duì)象的屬性是怎樣的,怎樣定義是靈活的。

看到上面的例子:面向?qū)ο蟮木幊谭绞?面向過(guò)程+面向?qū)ο?。?duì)象將某一些行為高度封裝,然后由指揮官也就是我們自己按照自己的想法按照某個(gè)順序調(diào)用(面向過(guò)程),在過(guò)程中,對(duì)象之間會(huì)進(jìn)行一定的數(shù)據(jù)交互與一定的對(duì)象之間的行為調(diào)用。

再舉個(gè)例子:實(shí)現(xiàn)一個(gè)循跡小車

構(gòu)建對(duì)象:傳感器 控制器 小車

小車對(duì)象:

  • 屬性:當(dāng)前偏移值

  • 行為:前進(jìn) ,后退 ,左轉(zhuǎn) ,右轉(zhuǎn)

控制器:

  • 屬性:輸入值,輸出值

  • 行為:計(jì)算控制值

傳感器:

  • 屬性:傳感器測(cè)量值 傳感器數(shù)量 傳感器

  • 行為:測(cè)量

//偽代碼
void Follow_mark(void)
{
	調(diào)用傳感器對(duì)象進(jìn)行測(cè)量,將測(cè)量值保存到器測(cè)量值
	調(diào)用控制器對(duì)象,將傳感器測(cè)量值作為輸入?yún)?shù),計(jì)算得到結(jié)果進(jìn)行保存
	調(diào)用小車對(duì)象,根據(jù)控制傳入的控制值,計(jì)算當(dāng)前偏移量,然后根據(jù)偏移量調(diào)用左轉(zhuǎn)/右轉(zhuǎn)行為
}

二、C語(yǔ)言實(shí)現(xiàn)面向?qū)ο?/h3>

面向?qū)ο蟮娜筇卣?/h4>

了解了面向?qū)ο蟮乃枷耄?strong>思想是最重要的,特征是次要的。面向?qū)ο缶哂腥筇卣鳎覀兓蚨嗷蛏俣伎梢詫?shí)現(xiàn),java,python,C++都有,但是C也是可以實(shí)現(xiàn)的,只是會(huì)比較麻煩,三大特征分別是封裝,繼承,多態(tài)。這三大特征能夠幫助實(shí)現(xiàn)面向?qū)ο蟮木幊蹋沟妹嫦驅(qū)ο笞兊酶鼉?yōu)雅。我們先了解三大特征之三大特征之封裝。

面向?qū)ο笾庋b

簡(jiǎn)介

封裝就是將對(duì)象的特征進(jìn)行封裝,使之對(duì)象的屬性和行為只能通過(guò)對(duì)象進(jìn)行訪問(wèn)。在上面的例子中,邀請(qǐng)的對(duì)象,它的屬性與行為是被封裝好的,我們只能調(diào)用邀請(qǐng)這個(gè)對(duì)象才能調(diào)用邀請(qǐng)對(duì)象的行為。

優(yōu)勢(shì):

1、隱藏內(nèi)部細(xì)節(jié),類似函數(shù),只需要調(diào)用這個(gè)邀請(qǐng)對(duì)象的行為發(fā)出邀請(qǐng),而不需要知道里面的底層實(shí)現(xiàn)

2、更安全,復(fù)用性更好。對(duì)象的值都是被封裝好的,隱藏掉的,一般是程序員只會(huì)提供相應(yīng)的接口來(lái)訪問(wèn),不能直接修改。復(fù)用性,從上面的例子,誰(shuí)都可以調(diào)用對(duì)象的行為。

代碼實(shí)現(xiàn)–基礎(chǔ)版

基礎(chǔ)版不涉及函數(shù)指針與函數(shù)表,先學(xué)習(xí)這個(gè)基礎(chǔ)版的,理解好面向?qū)ο蟮淖詈?jiǎn)單的封裝的實(shí)現(xiàn)。

在實(shí)現(xiàn)前我們先想一想C到底有什么結(jié)構(gòu)可以實(shí)現(xiàn)封裝屬性,各種屬性。這個(gè)很簡(jiǎn)單,結(jié)構(gòu)體嘛,能放各種類型的屬性。

行為又怎么體現(xiàn)呢,可以實(shí)現(xiàn)各種行為,函數(shù)嘛。后面的多態(tài)會(huì)涉及函數(shù)指針,使用函數(shù)指針可以實(shí)現(xiàn)多態(tài),這都是后面的事情,后面的文章會(huì)有簡(jiǎn)介。

那讓我們做一個(gè)PID控制器的對(duì)象吧,如果不懂的小伙伴也沒(méi)關(guān)系,這個(gè)只是控制器,有輸入,輸出,調(diào)試參數(shù),了解這些就行了。具體實(shí)現(xiàn)過(guò)程,內(nèi)部細(xì)節(jié)不懂也沒(méi)關(guān)系,這個(gè)不重要,我代碼會(huì)標(biāo)出來(lái)的。

那我們直接閱讀代碼,進(jìn)入困難模式:代碼會(huì)有比較詳細(xì)的注釋,很容易看懂!

//開(kāi)始構(gòu)造對(duì)象,既然是控制器,對(duì)象必須具有輸入,輸出,調(diào)試參數(shù)
//屬性就是:參數(shù)值,輸入值,輸出值
//行為就是:設(shè)置參數(shù),查看參數(shù),根據(jù)輸入計(jì)算輸出,構(gòu)造對(duì)象,刪除對(duì)象
//屬性:用結(jié)構(gòu)體實(shí)現(xiàn)
#include "stdio.h"
#include <string.h>
#include <stdlib.h>
//控制器對(duì)象
//控制器對(duì)象屬性
typedef struct 
{
    int input;/*控制器輸入*/
    int ouput;/*控制器輸出*/
    int P_parameter,I_parameter,D_parameter;/*控制調(diào)試參數(shù)*/
    int Sum_error;/*總偏差,位置式PID積分相關(guān)的參數(shù)*/
    int Last_error;/*上次偏差,位置式PID積分相關(guān)的參數(shù)*/
}controller;
//構(gòu)造對(duì)象,初始化
controller *Ctor_controller(void)
{  
    controller *temp;
    temp=(controller *)malloc(sizeof(controller));
    //清零
    memset(temp,0,sizeof(controller));
    return temp;
}
//刪除對(duì)象
void Del_ontroller(controller * const Me)
{
    if(Me!=NULL) free(Me);
}
//設(shè)置控制器參數(shù)
void Write_controller(controller * const Me,int P,int I,int D)
{
    Me->P_parameter=P;
    Me->I_parameter=I;
    Me->D_parameter=D;
}
//讀取控制器參數(shù)的值
controller Read_controller(const controller * const Me,int P,int I,int D)
{
    return (*Me);
}
//計(jì)算控制器輸出,細(xì)節(jié)看不懂沒(méi)關(guān)系,只需要知道傳入的是偏差,就會(huì)有輸出一個(gè)計(jì)算結(jié)果就行,這個(gè)結(jié)果能夠幫助控制
//至于偏差怎么定義什么時(shí)候需要用到PID控制器就知道了
int Out_controller(controller * const Me,int input)
{
    float	iIncpid=0;
    int now_error=input;//當(dāng)前偏差
	Me->Sum_error+=input; 
    //積分量限幅,方式積分飽和過(guò)深
	if(Me->Sum_error >500)
	{
		Me->Sum_error = 500 ;
	}
	if(Me->Sum_error < -500)
	{
		Me->Sum_error = -500 ;
	}
    Me->ouput=Me->P_parameter * input                  // P
         +Me->I_parameter * Me->Sum_error                // I
         +Me->D_parameter * (now_error-Me->Last_error); // D
    Me->Last_error=now_error;					// 存儲(chǔ)誤差,用于下次計(jì)算		
    return(Me->ouput);           // 返回計(jì)算值    
}
int main()
{
    controller *test;
    controller read_val;
    //構(gòu)造,創(chuàng)建一個(gè)對(duì)象
    test=Ctor_controller();
    //設(shè)置對(duì)象的值
    Write_controller(test,1,1,1);
    //查看對(duì)象的值
    read_val=Read_controller(test,1,1,1);
    printf("對(duì)象 P= %d I=%d D=%d \r\n",read_val.P_parameter,read_val.I_parameter,read_val.D_parameter);
    //調(diào)用控制器一次:
    printf("控制器輸出=%d \r\n",Out_controller(test,100));
    //刪除/銷毀一個(gè)對(duì)象
    Del_ontroller(test);
}

輸出結(jié)果:

對(duì)象 P= 1 I=1 D=1 
控制器輸出=300 

從上面的例子可以看出來(lái),我直接調(diào)用對(duì)象,就可以實(shí)現(xiàn)封裝,設(shè)置,查看等,注意使用了需要手動(dòng)調(diào)用刪除,不然容易出現(xiàn)內(nèi)存泄漏,對(duì)象的生存時(shí)間就是我們程序員自己釋放前的時(shí)間。

這里是使用堆的方式,容易出現(xiàn)內(nèi)存溢出的情況,如果是單片機(jī)等其他資源較小的單元,可以使用其他方式構(gòu)造對(duì)象,比如下面:對(duì)象的生存時(shí)間就是主函數(shù)的結(jié)束時(shí)間,編譯器替我們釋放了對(duì)象的資源,不需要我們主動(dòng)進(jìn)行釋放。

#include "stdio.h"
#include <string.h>
#include <stdlib.h>
//控制器對(duì)象
//控制器對(duì)象屬性
typedef struct 
{
    int input;/*控制器輸入*/
    int ouput;/*控制器輸出*/
    int P_parameter,I_parameter,D_parameter;/*控制調(diào)試參數(shù)*/
    int Sum_error;/*總偏差,位置式PID積分相關(guān)的參數(shù)*/
    int Last_error;/*上次偏差,位置式PID積分相關(guān)的參數(shù)*/
}controller;
//構(gòu)造對(duì)象,初始化
void Ctor_controller(controller * const Me)
{  
    //清零
    memset(Me,0,sizeof(controller));
}
//刪除對(duì)象
void Del_ontroller(controller * const Me)
{
    ;
}
//設(shè)置控制器參數(shù)
void Write_controller(controller * const Me,int P,int I,int D)
{
    Me->P_parameter=P;
    Me->I_parameter=I;
    Me->D_parameter=D;
}
//讀取控制器參數(shù)的值
controller Read_controller(const controller * const Me,int P,int I,int D)
{
    return (*Me);
}
//計(jì)算控制器輸出,細(xì)節(jié)看不懂沒(méi)關(guān)系,只需要知道傳入的是偏差,就會(huì)有輸出一個(gè)計(jì)算結(jié)果就行,這個(gè)結(jié)果能夠幫助控制
//至于偏差怎么定義什么時(shí)候需要用到PID控制器就知道了
int Out_controller(controller * const Me,int input)
{
    float	iIncpid=0;
    int now_error=input;//當(dāng)前偏差
	Me->Sum_error+=input; 
    //積分量限幅,方式積分飽和過(guò)深
	if(Me->Sum_error >500)
	{
		Me->Sum_error = 500 ;
	}
	if(Me->Sum_error < -500)
	{
		Me->Sum_error = -500 ;
	}
    Me->ouput=Me->P_parameter * input                  // P
         +Me->I_parameter * Me->Sum_error                // I
         +Me->D_parameter * (now_error-Me->Last_error); // D
    Me->Last_error=now_error;					// 存儲(chǔ)誤差,用于下次計(jì)算		
    return(Me->ouput);           // 返回計(jì)算值    
}
int main()
{
    controller test;
    controller read_val;
    //構(gòu)造,創(chuàng)建一個(gè)對(duì)象
    Ctor_controller(&test);
    //設(shè)置對(duì)象的值
    Write_controller(&test,1,1,1);
    //查看對(duì)象的值
    read_val=Read_controller(&test,1,1,1);
    printf("對(duì)象 P= %d I=%d D=%d \r\n",read_val.P_parameter,read_val.I_parameter,read_val.D_parameter);
    //調(diào)用控制器一次:
    printf("控制器輸出=%d \r\n",Out_controller(&test,100));
}

代碼實(shí)現(xiàn)-進(jìn)階版

到進(jìn)階版,才能夠完整的看到封裝的實(shí)現(xiàn),封裝里面就具有了對(duì)象的屬性與行為。這里我們通過(guò)函數(shù)指針訪問(wèn)對(duì)象的行為,我們可以通過(guò)函數(shù)指針訪問(wèn)對(duì)象的行為。

那具體行為是怎么實(shí)現(xiàn)的呢?實(shí)現(xiàn)是通過(guò)函數(shù)表中的函數(shù)指針來(lái)訪問(wèn)函數(shù),以此來(lái)實(shí)現(xiàn)不同函數(shù)的調(diào)用,從而實(shí)現(xiàn)對(duì)象的行為。

那讓我們看一下代碼實(shí)現(xiàn),然后分析指針指向就知道函數(shù)是怎么實(shí)現(xiàn)的。

頭文件 :定義了對(duì)象的屬性與行為

#ifndef __OOP_H
#define __OOP_H
//控制器對(duì)象
struct controller_vtbl;
typedef struct 
{
    //對(duì)象屬性    
    int input;/*控制器輸入*/
    int ouput;/*控制器輸出*/
    int P_parameter,I_parameter,D_parameter;/*控制調(diào)試參數(shù)*/
    int Sum_error;/*總偏差,位置式PID積分相關(guān)的參數(shù)*/
    int Last_error;/*上次偏差,位置式PID積分相關(guān)的參數(shù)*/
    //對(duì)象行為指針,通過(guò)指針訪問(wèn)函數(shù)
    struct controller_vtbl *vptr;
}controller;
//對(duì)象的行為所在表,定義對(duì)象的行為在這里,通過(guò)定義函數(shù)指針指向需要實(shí)現(xiàn)對(duì)象行為的指針
struct controller_vtbl
{
    controller * (*Ctor_controller)(void);
    void         (*Del_controller)(controller * const Me);
    controller   (*Read_controller)(const controller * const Me);
    void         (*Write_controller)(controller * const Me,int P,int I,int D);
    int          (*Out_controller)(controller * const Me,int input);
};
//對(duì)象行為函數(shù)
controller * Ctor_controller(void);
void Del_controller(controller * const Me);
controller Read_controller(const controller * const Me);
void Write_controller(controller * const Me,int P,int I,int D);
int Out_controller(controller * const Me,int input);
#endif

源文件::具體函數(shù)的行為屬性的實(shí)現(xiàn)就在這里

//開(kāi)始構(gòu)造對(duì)象,既然是控制器,對(duì)象必須具有輸入,輸出,調(diào)試參數(shù)
//屬性就是:參數(shù)值,輸入值,輸出值
//行為就是:設(shè)置參數(shù),查看參數(shù),根據(jù)輸入計(jì)算輸出,構(gòu)造對(duì)象,刪除對(duì)象
//屬性:用結(jié)構(gòu)體實(shí)現(xiàn)
#include "stdio.h"
#include <string.h>
#include <stdlib.h>
#include "temp.h"
//構(gòu)造對(duì)象,初始化
controller * Ctor_controller(void)
{  
    controller *ptr;
    struct controller_vtbl *table;
    ptr=(controller *)malloc(sizeof(controller));
    table=(struct controller_vtbl *)malloc(sizeof(struct controller_vtbl));    
    //清零
    memset(ptr,0,sizeof(controller));
    table->Ctor_controller=&Ctor_controller;
    table->Del_controller=&Del_controller;
    table->Out_controller=&Out_controller;
    table->Write_controller=&Write_controller;
    table->Read_controller=&Read_controller;
    ptr->vptr=table;
    return ptr;
}
//刪除對(duì)象/析構(gòu)對(duì)象
void Del_controller(controller * const Me)
{
    if(Me!=NULL) 
    {
        free(Me->vptr);
        free(Me);
    }
}
//設(shè)置控制器參數(shù)
void Write_controller(controller * const Me,int P,int I,int D)
{
    Me->P_parameter=P;
    Me->I_parameter=I;
    Me->D_parameter=D;
}
//讀取控制器參數(shù)的值
controller Read_controller(const controller * const Me)
{
    return (*Me);
}
//計(jì)算控制器輸出,細(xì)節(jié)看不懂沒(méi)關(guān)系,只需要知道傳入的是偏差,就會(huì)有輸出一個(gè)計(jì)算結(jié)果就行,這個(gè)結(jié)果能夠幫助控制
//至于偏差怎么定義什么時(shí)候需要用到PID控制器就知道了
int Out_controller(controller * const Me,int input)
{
    float	iIncpid=0;
    int now_error=input;//當(dāng)前偏差
	Me->Sum_error+=input; 
    //積分量限幅,方式積分飽和過(guò)深
	if(Me->Sum_error >500)
	{
		Me->Sum_error = 500 ;
	}
	if(Me->Sum_error < -500)
	{
		Me->Sum_error = -500 ;
	}
    Me->ouput=Me->P_parameter * input                  // P
         +Me->I_parameter * Me->Sum_error                // I
         +Me->D_parameter * (now_error-Me->Last_error); // D
    Me->Last_error=now_error;					// 存儲(chǔ)誤差,用于下次計(jì)算		
    return(Me->ouput);                          // 返回計(jì)算值    
}
int main()
{
    controller *test;
    controller read_val;
    //構(gòu)造,創(chuàng)建一個(gè)對(duì)象,返回對(duì)象指針
    test=Ctor_controller();
    //設(shè)置對(duì)象的值 
    test->vptr->Write_controller(test,1,1,1);
    //查看對(duì)象的值
    read_val=test->vptr->Read_controller(test);
    printf("對(duì)象 P= %d I=%d D=%d \r\n",read_val.P_parameter,read_val.I_parameter,read_val.D_parameter);
    //調(diào)用控制器一次:
    printf("控制器輸出=%d \r\n",test->vptr->Out_controller(test,100));
    //刪除/銷毀一個(gè)對(duì)象
    test->vptr->Del_controller(test);
}

運(yùn)行結(jié)果:

對(duì)象 P= 1 I=1 D=1 
控制器輸出=300 

可以看到,我們這次操作對(duì)象并不是直接調(diào)用函數(shù),而是通過(guò)指針的方式來(lái)訪問(wèn)具體的哪個(gè)函數(shù),而指針是在創(chuàng)建的對(duì)象里面的,這樣就可以直接通過(guò)對(duì)象來(lái)訪問(wèn)它的行為。

后面實(shí)現(xiàn)多態(tài)也是使用了函數(shù)指針的方式,在多態(tài)里面這里的指針與行為表有了它自己的名字,就是虛指針與虛表。

到此,關(guān)于“C語(yǔ)言面向?qū)ο缶幊讨械姆庋b是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI