誤解
抽象クラスはインスタンス化できないので,抽象クラスへのポインタ型変数を作ることはできない(誤).
結論
抽象クラスはインスタンス化できないが,抽象クラスへのポインタ型変数に子クラスのインスタンスのアドレスを代入することは可能.
抽象クラス
純粋仮想関数を持つクラス.
インスタンス化できない.
親クラス型の変数と子クラスのインスタンス
親クラス型の変数が使用したい関数は,継承によってその子クラスも使用できるため,親クラス型の変数に子クラスのインスタンスを代入することができる.
これらのポインタ変数も同様.
(子クラス型の変数に親クラスのインスタンスを代入することはできない.なぜならば,子クラス型の変数が使用したい関数を,親クラスが使用できるとは限らないからだ.)
具体例
ソースコード
pure.cpp
#include<iostream>
// 親クラス
class Parent {
public:
// 純粋仮想関数
virtual void hello() = 0;
};
// 子クラス
class Child : public Parent {
public:
void hello() {
std::cout << "hello" << std::endl;
}
};
int main() {
// 抽象クラスのインスタンス化は不可
// Parent* parent = new Parent();
// 親クラスへのポインタ型変数に子クラスのインスタンスのアドレスを代入することは可.
// インスタンス化しているのは抽象クラスではなく子クラス
Parent* parent = new Child();
parent->hello(); // hello
delete parent;
// これはエラー
// Parent parent2 = Child();
return 0;
}
コンパイル
$ g++ -std=c++17 -Wall --pedantic-errors -o pure.exe pure.cpp
実行結果
$ ./pure.exe
hello