アフィリエイト広告を利用しています

広告

posted by fanblog

2017年12月25日

《その204》 抽象クラス(2)


 抽象クラス

 前回《203》、仮想関数からの派生関数 Rectangle を作成しました。
Rectangl関数は四角形クラスでしたが、今回は、横線クラス HorzLine と縦線クラス VertLine を作成します。

  ※ '-' で描く横線クラス  … HorzLine
  ※ '|' で描く縦線クラス  … VertLine


 この2つの関数には、"線"という共通点があります。"線"ならば、その線の長さをデータメンバとして持っていなければなりません。

 そこで、まず、直線クラス Line を考えます。線を描く方法は、横線と縦線で異なるので関数 draw は、ここではまだ定義できません。

  class Shape {
  public:
    virtual void draw() = 0;
  };

  class Line : public Shape {
    int length;  // 線の長さ
  public:
  };



 この Lineクラスは、Shapeクラスの public派生クラスですが、
基底クラス Shape の純粋仮想関数 draw をオーバーライドしていません。
そのため、Lineクラスにおいても、draw は純粋仮想関数のままです。

 純粋仮想関数を有するクラスは、抽象クラスです。

したがって、Lineクラスは、まだ抽象クラスです。


 次のプログラムでは、Lineクラスの public派生クラスとして、
横線クラス HorzLine,縦線クラス VertLine を定義しています。


// ------------------------------------
#include <iostream>

// 図形クラス(抽象クラス) Shape
class Shape {
public:
virtual ~Shape() = 0;
// 純粋仮想デストラクタ

virtual void draw() const = 0;
// 描画
// 純粋仮想関数

};

inline Shape::~Shape() { }

// 長方形クラス Rectangle
class Rectangle : public Shape {
int width; // 横幅
int height; // 高さ

public:
Rectangle(int w, int h)
: width(w), height(h) { }

void draw() const {
for (int i = 1; i <= height; i++) {
for (int j = 1; j <= width; j++)
std::cout << '*';
std::cout << '\n';
}
}
};

// 直線クラス(抽象クラス) Line
class Line : public Shape {
protected:
int length; // 線の長さ
public:
Line(int len) : length(len) { }
};


// 横線クラス HorzLine
class HorzLine : public Line {
public:
HorzLine(int len) : Line(len) { }

void draw() const {
for (int i = 1; i <= length; i++)
std::cout << '-';
std::cout << '\n';
}
};

// 縦線クラス VertLine
class VertLine : public Line {
public:
VertLine(int len) : Line(len) { }

void draw() const {
for (int i = 1; i <= length; i++)
std::cout << "|\n";
}
};

int main() {
Rectangle a(5, 3);
HorzLine c(20);
VertLine d(3);

a.draw(); std::cout << '\n';
c.draw(); std::cout << '\n';
d.draw();
}
// ------------------------------------

f06_0002.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)





この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7128054
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。