0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

構造体と関数ポインタを使用した仮想関数の方法

Last updated at Posted at 2023-09-16

前回

説明

 C言語は、手続型言語として有名な言語です。一見、オブジェクト指向設計やオブジェクト指向プログラミングには適さない言語として見られがちですが、C言語の性質上、構造体を用いることでオブジェクト指向のプログラミング技法は成立します。
 今回は、オブジェクト指向のプログラミング技法の一つとして仮想関数の考え方をプログラミングしてみます。C言語では、オブジェクト指向における仮想関数の完全な方法は実現できませんが、仮想関数の考え方に近い形で実現することができます。
 

参考ページ

モノづくりC言語塾 C言語 関数ポインタ【ポインタを使って関数を呼ぶ仕組み解説】

超初心者向けプログラミング入門【構造体】

参考文献

準備

console
clang -lm sample.c -o sample
./sample

もしくはオンラインコンパイラを使用します。
オンラインコンパイラ
Cコンパイラを使ってください。

ソースコード

sample.c
#include <stdio.h>

// 基底クラス
typedef struct {
    void (*print)(void*);
} Base;

void basePrint(void* self) {
    printf("Base struct\n");
}

// 派生クラス
typedef struct {
    Base base;
    void (*print)(void*);
} Derived;

void derivedPrint(void* self) {
    printf("Derived struct\n");
}

int main() {
    Base base;
    base.print = basePrint;

    Derived derived;
    derived.base.print = derivedPrint;

    Base* ptr = &base;
    ptr->print(ptr);

    ptr = (Base*)&derived;
    ptr->print(ptr);

    return 0;
}

実行結果

console
Base struct
Derived struct

考察

 結果から考察すると、C言語は手続型言語ですが、構造体を用いることでオブジェクト指向プログラミングの考え方は取り入れることができます。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?