継承: コードの再利用と拡張
virtual と override でポリモーフィズムを実現。
継承
親クラスの機能を引き継ぐ。
virtual
派生クラスでオーバーライド可能に。
override
オーバーライドを明示(C++11)。
継承とは?
継承の最大のメリットは「差分プログラミング」です。共通部分は基底クラスに書き、派生クラスでは「何が違うか」だけを書きます。ただし、継承のしすぎは「親への依存」を強めるため、最近は「継承よりコンポジション(委譲)」が好まれることもあります。
class Animal {protected: std::string name_;public: Animal(std::string name) : name_(std::move(name)) {} virtual ~Animal() = default;
virtual void speak() const { std::cout << name_ << " makes a sound\n"; }};
class Dog : public Animal {public: using Animal::Animal; // コンストラクタ継承
void speak() const override { std::cout << name_ << " barks!\n"; }};実行結果
Dog is running\nDog says: Woof!
Bad
// ❌ Bad: virtual なしでポリモーフィズムclass Base { void foo() { /*...*/ } // 非仮想};class Derived : public Base { void foo() { /*...*/ } // オーバーライドされない};Good
// ✅ Good: virtual + overrideclass Base { virtual void foo() { /*...*/ } virtual ~Base() = default;};class Derived : public Base { void foo() override { /*...*/ }};抽象クラス
// 純粋仮想関数(抽象クラス)class Shape {public: virtual double area() const = 0; // 純粋仮想 virtual ~Shape() = default;};
class Circle : public Shape { double radius_;public: Circle(double r) : radius_(r) {} double area() const override { return 3.14159 * radius_ * radius_; }};
// final: 継承・オーバーライド禁止class FinalClass final { };void foo() final; Tip: ポリモーフィックな基底クラスは必ず virtual デストラクタ。
合格ライン
virtual と override を使える
純粋仮想関数を定義できる
参考リンク
演習課題
課題1: 継承の基本
Vehicle 基底クラスと Car, Bike 派生クラスを作成してください。
課題2: virtual override
virtual 関数を派生クラスで override し、異なる動作を実装してください。