C物件導向(封裝 繼承 多型)

2021-09-26 04:51:15 字數 3204 閱讀 2111

物件導向的基本思考方式是的將資料和處理資料的行為放在一起,降低耦合性,其要點就是不要將資料和處理資料的行為分開。

所謂多型性就是指從呼叫者的角度看物件,會發現它們非常相似,難以區分,但是這些被呼叫物件的內部處理實際上各不相同。

結構體宣告和呼叫:

typedef struct _validator  validator;
bool validate(validator *p, int val)
多型,就是說用同一的介面**處理不同的資料。比如說,這裡的validator結構就是乙個通用的資料結構,我們也不清楚pdata是什麼資料,validate是什麼處理函式?但是,我們處理的時候只要呼叫p->validate(p, val)就可以了。剩下來的事情我們不需要管,因為不同的介面會有不同的函式去處理,我們只要學會呼叫就可以了。

物件導向程式設計中最重要的乙個概念是繼承。繼承允許我們依據另乙個類來定義乙個類,這使得建立和維護乙個應用程式變得更容易。

前面的例子中其實已經對繼承有所體現,用pdata指標指向range或previousvalue結構體;

只不過這種父類子類的繼承比較模糊;

typedef struct _validator  validator;

typedef struct range;

typedef struct previousvalue;

為了更直觀的展示繼承關係,使用如下解決方法:

在設計c語言繼承性的時候,我們需要做的就是把基礎資料放在繼承的結構的首位置即可。這樣,不管是資料的訪問、資料的強轉、資料的訪問都不會有什麼問題。

typedef struct _validator  validator;

typedef struct rangevalidator;

typedef struct previousvaluevalidator;

封裝是指通過物件的狀態和行為集中在一起,並規定其與外部的介面來進行抽象化的過程。

單純從文字上很難理解,那麼把狀態認為是結構體中函式指標以外的成員,把行為認為是函式指標成員,就很容易了。

封裝的主要含義是隱藏內部的行為和資訊,使用者只用看到對外提供的介面和公開的資訊。

例如:

typedef struct _validator  validator;

typedef struct rangevalidator;

struct _data;

typedef void (*process)(struct _data* pdata);

typedef struct _data

data;

封裝性的意義在於,函式和資料是綁在一起的,資料和結構體是綁在一起的。這樣,我們就可以通過簡單的乙個結構指標訪問到所有的資料,遍歷所有的函式。封裝性,這是類擁有的屬性,當然也是資料結構體擁有的屬性。

資料隱藏:

1.在c語言中沒有提供訪問控制功能,無法實現資料隱藏,但這也並非大問題。實際上在前面的例子中,我們使用了const修飾符,這樣就不必擔心從外部呼叫不小心修改內部資料了。

2.可以規定成員命名規則來規避這個問題,例如不允許直接訪問的成員命名時以下劃線「_」開頭。

完整**示例:

stack.h

#ifndef _stack_h_

#define _stack_h_

#include #ifdef __cplusplus

extern "c" validator;

typedef struct rangevalidator;

typedef struct previousvaluevalidator;

typedef struct stack;

bool validaterange(validator *pthis, int val);

bool validateprevious(validator *pthis, int val);

#define newrangevalidator(min, max) \

, (min), (max)}

#define newpreviousvaluevalidator \

, 0}

bool push(stack *p, int val);

bool pop(stack *p, int *pret);

#define newstack(buf)

#define newstackwithvalidator(buf, pvalidator)

#ifdef __cplusplus

}#endif

#endif

stack.c

#include #include "stack.h"

static bool isstackfull(const stack *p)

static bool isstackempty(const stack *p)

bool validaterange(validator *p, int val)

bool validateprevious(validator *p, int val)

bool validate(validator *p, int val)

// true: 成功, false: 失敗

bool push(stack *p, int val)

// true: 成功, false: 失敗

bool pop(stack *p, int *pret)

測試**: 

#include "gtest/gtest.h"

#include #include "stack.h"

test(stacktest, popfromemptystackreturnsfalse)

test(stacktest, popreturnsstacktopandremoveit)

test(stacktest, pushtofullstackreturnsfalse)

test(stacktest, pushwithrangecheck)

test(stacktest, pushwithpreviouscheck)

int main(int argc, char **ar**)

C 物件導向(封裝,繼承,多型)

c 封裝繼承多型總結 物件導向的三個基本特徵 物件導向的三個基本特徵是 封裝 繼承 多型。其中,封裝可以隱藏實現細節,使得 模組化 繼承可以擴充套件已存在的 模組 類 它們的目的都是為了 重用。而多型則是為了實現另乙個目的 介面重用!封裝 什麼是封裝?封裝可以隱藏實現細節,使得 模組化 封裝是把過程...

物件導向 封裝 繼承 多型

物件導向 封裝 繼承 多型物件導向 封裝 一 封裝 private 資料型別 名字 成員變數 public 預設一致 名字 屬性 set 類中不僅可以有成員變數和屬性,還可以有成員方法 訪問修飾符 4個 public 公共的,任何地方都可以訪問,但是需要引用 命名空間 private 私有的,類的內...

C 物件導向特性 封裝 繼承 多型

將方法細節隱藏,只留名字。public 所有物件都可以訪問 private 物件本身在物件內部可以訪問 protected 只有該類物件及其子類物件可以訪問 internal 同乙個程式集的物件可以訪問 protected internal 乙個程式集內的物件,或者該類物件及其子類可以訪問 以上是常...