継承: コードの再利用と拡張

virtual と override でポリモーフィズムを実現。

継承
親クラスの機能を引き継ぐ。
virtual
派生クラスでオーバーライド可能に。
override
オーバーライドを明示(C++11)。

継承とは?

親子のアパート (Family Apartment)

継承は「親の遺産」を引き継ぐことです。親(Animal)が「呼吸する機能」を持っていれば、子(Dog)は努力ゼロで「呼吸する機能」を手に入れます。さらに子は「吠える」という独自機能を追加(拡張)できます。

継承の最大のメリットは「差分プログラミング」です。共通部分は基底クラスに書き、派生クラスでは「何が違うか」だけを書きます。ただし、継承のしすぎは「親への依存」を強めるため、最近は「継承よりコンポジション(委譲)」が好まれることもあります。

Basic Inheritance
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 + override
class Base {
virtual void foo() { /*...*/ }
virtual ~Base() = default;
};
class Derived : public Base {
void foo() override { /*...*/ }
};

抽象クラス

Pure Virtual & final
// 純粋仮想関数(抽象クラス)
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 し、異なる動作を実装してください。

次のステップ