Visualization Tool Kit(VTK)など

×

派生と仮想関数

用語

親クラス: 基底クラス,スーパークラス
子クラス: 派生クラス,サブクラス

効果

Aを抽象化(一般化)したものがBの時,すなわちA is Bの時,AはBの派生型である.
  1. コードの再利用: コード重複の回避
  2. 汎化: どの派生クラスか使う側は気にしない

構文

class Parent
{
public:
  Parent()
  {
    std::cout << "Parent::Parent" << std::endl;
  }
};

class Child : public Parent
{
public:
  Child()
  {
    std::cout << "Child::Child" << std::endl;
  }
};

void main()
{
  Child c;
}

オーバーライド(実装の上書き)と仮想関数

派生クラスで基底クラスの関数を再定義する時,その関数は仮想関数とする.

class Parent
{
public:
  void PrintName()
  {
    std::cout << GetName() << std::endl;
  }
  virtual std::string GetName()
  {
    return "Parent";
  }
};

class Child : public Parent
{
public:
  virtual std::string GetName()
  {
    return "Child";
  }
};

void main()
{
  Child c;
  c.PrintName(); // virtualの有無で振る舞いを比較せよ.
}

純粋仮想関数

抽象的な基底クラスにおいて,インターフェイス(関数の存在)のみを定義する場合,純粋仮想関数とする.

class Parent
{
public:
  virtual void Func() = 0;
};

class Child : public Parent
{
public:
  virtual void Func()
  {
    std::cout << "Child::Func" << std::endl;
  }
}


純粋仮想関数を持つクラスはオブジェクト化できないため,全ての具体的な派生クラスにおいてその関数の実装が保証される.

汎化の効用

使う側において特化したものを意識しなくてよい.

class Base
{
public:
  virtual void Execute() = 0;
};

class Derived1 : public Base
{
public:
  virtual void Execute()
  {
    std::cout << "Derived1::Execute" << std::endl;
  }
};

class Derived2 : public Base
{
public:
  virtual void Execute()
  {
    std::cout << "Derived2::Execute" << std::endl;
  }
};

class User
{
public:
  void Set(Base* b)
  {
    base = b;
  }

  void Update()
  {
    base->Execute();
  }

private:
  Base* base;
};

void main()
{
  User user;
  Derived1 d1;
  Derived2 d2;

  user.Set(&d1);
  user.Update();

  user.Set(&d2);
  user.Update();
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー

チュートリアル

アルゴリズム(数学)

並列計算

STL

#include<memory> #include<string> #include<sstream> #include<algorithm> #include<functional> #include<numeric>

Media Foundation

【メニュー編集】
Wiki記法ガイド

メンバーのみ編集できます

広告募集中