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();
}

コメントをかく