C++
クラス
継承

C++でクラス作成〜継承〜関数の抽象化までを試してみる

More than 1 year has passed since last update.

概要

最近C++を勉強中です。
C++でのクラス作成やら、ファイル分けたりやらのやり方を調べてみました。

1.C++のクラスの作成

ヘッダファイルと、関数を実装するC++ファイルとを分けて作成する。
(ちなみに、この後継承とかもやってみたい、という思いからファイル名がParentになってます)

ヘッダファイル

Parent.h
class Parent
{
public:
    void showMessage(const char* message);
};

C++ファイル

続いて、ヘッダファイルを読み込むC++ファイルを作成する

Parent.cpp
#include <iostream>
#include "Parent.h"

/**
 * メッセージを出力する
 */
void Parent::showMessage(const char* message)
{
    std::cout << "[message]" << message << std::endl;
}

ここまででクラスの作成はOK

実行ファイル

作成したC++のクラスを読み込み、showMessageメソッドを実行する、実行ファイルを用意する。

run.cpp
#include "Parent.h"

int main()
{
    Parent pt;
    pt.showMessage("Hello!");

    return 0;
}

コンパイル・実行

$ g++ -o run run.cpp Parent.cpp
$ ./run
[message]Hello!

無事、結果が出力されたようです。

2.クラスの継承

次に、継承をやってみます。
1.で作成した親クラスを変更し、

親 -> メッセージの出力のみ
子 -> メッセージの設定のみ

といった感じにしてみます。

親クラス

Parent.h
/**
 *  親クラス
 */
class Parent
{
public:
    const char* message;
    void showMessage();
};
Parent.cpp
#include <iostream>
#include "Parent.h"

/**
 * メッセージを出力する
 */
void Parent::showMessage()
{
    std::cout << "[message]" << this->message << std::endl;
}

子クラス

子クラスはParentクラスを継承し、setMessageという関数を実装します。

Child.h
#include "Parent.h"

/**
 * 子クラス
 */
class Child : public Parent
{
public:
    void setMessage(const char* message);
};
Child.cpp
#include "Child.h"

/**
 * メッセージを設定する
 */
void Child::setMessage(const char* message)
{
    this->message = message;
}

実行クラス

run.cpp
#include "Child.h"

int main()
{
    Child ch;
    ch.setMessage("Hello!");
    ch.showMessage();

    return 0;
}

実行

$ g++ -o run run.cpp Parent.cpp Child.cpp
$ ./run
[message]Hello!

実行できました!

3.関数の抽象化

仮想関数

さらに、子クラスで実装した「setMessage」関数を、親クラスで抽象化して宣言してみます。
「仮想関数」と呼ぶようです。
こんな感じ。

Parent.h
/**
 *  親クラス
 */
class Parent
{
public:
    const char* message;

    void showMessage();

    // abstractのイメージ。「= 0」をつける(純粋仮想関数)
    virtual void setMessage(const char* message) = 0;
};

実行

$ g++ -o run run.cpp Parent.cpp Child.cpp
$ ./run
[message]Hello!

正常にコンパイル・実行できました。

うーん、まだC++全然慣れないっすねw

Makefileの作り方とかも勉強しようと思います。