これは設計上の欠陥ではありません。それは完全に問題ありません。
- 動的ディスパッチを使用しない限り、派生クラスの関数は基本クラスの関数を非表示にし、派生クラスの適切なオーバーロード関数が選択されます (以下のサンプル プログラムの最初の 3 つの出力)。
- 動的ディスパッチの場合、オブジェクトの実際のタイプに応じて、適切なオーバーライドされた関数 (オーバーライドされた関数は
int
引数として受け取る関数であることに注意してください) が呼び出されます (以下のサンプルの最後の 3 つの出力)。
わかりやすくするために、サンプル プログラムを考えてみましょう。
#include<iostream>
class Base
{
public:
virtual double Function(int i) const{std::cout<<"\nIn Base int version";}
};
class SubClass : public Base
{
public:
virtual double Function(int i) const{std::cout<<"\nIn Derived int version";}
double Function(std::string str) const{std::cout<<"\nIn Derived string version";}
double Function(double i) const {std::cout<<"\nIn Derived double version";}
};
int main()
{
SubClass obj;
obj.Function(10);
obj.Function(10.1);
obj.Function("Hello");
Base Bobj;
Bobj.Function(10.2);
Base *ptr = new Base;
ptr->Function(10.5);
Base *ptr2 = new SubClass;
ptr2->Function(10);
ptr2->Function(10.5);
delete ptr;
delete ptr2;
return 0;
}
出力は次のとおりです。
In Derived int version
In Derived double version
In Derived string version
In Base int version
In Base int version
In Derived int version
In Derived int version
具体的には、最後の 2 つの出力に注目してください。