Edited at

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の作り方とかも勉強しようと思います。