これが私が覚えていたことです:
C++ では、派生クラスが同じ名前のメンバー関数を定義しているが、基本クラスとは異なるシグネチャ (パラメーターなど) を定義している場合、対応するメンバー関数を基本クラスで「非表示」にします。例えば
class Base {
public:
void virtual f(double x);
};
class Derived : public Base {
public:
void f(char c);
};
int main()
{
Derived* d = new Derived();
Base* b = d;
b->f(65.3); // call f(double x)
d->f(65.3); // call f(char c)
delete d;
return 0;
}
私が間違っている場合は修正してください。ただし、C++ で「非表示」と言うと、派生クラスが「f(double x)」を認識できない、つまり、派生クラスに「f(double x)」がないことも意味します。 Base から継承されたメンバー関数として正しいですか?
Java チュートリアルでは、「非表示」は実際には別の意味 (静的クラス メソッドの場合) ですが、インスタンス メソッドの場合は、ベースから継承されたメソッドをオーバーロードできます。この例を見る:継承されたオーバーロードされたメソッドの使用
public class ClassA {
public void method(Number n) {
System.out.println("ClassA: " + n + " " + n.getClass());
}
}
public class ClassB extends ClassA {
public void method(Integer d) {
System.out.println("ClassB: " + d + " " + d.getClass());
}
}
ClassA a = new ClassB();
a.method(3);
C++ タイプの考え方では、C++ の「動的バインディング」と「非表示」のアイデアに基づいて、クラス A の「method(Number n)」が呼び出されるのと同じ結果が得られますが、次のようになります。
Javaで説明する方法がまだわかりません。リンク自体は、「コンパイル時にメソッドシグネチャが選択される」と「実際にはクラスBから呼び出している」を使用して説明しています。でもC++の考え方では前者でもいいのですが、クラスBからの呼び出しではなく、クラスAからの呼び出しのはずですよね?
継承されたオーバーロードされたメソッドの使用と Java チュートリアルでは、「クラス B」は「クラス A」から関数をオーバーロードすることが許可されており、「クラス B」は実際には「メソッド (数値 n)」と「メソッド (整数 d)」の両方を見ることができます。つまり、C++ と Java ではオーバーロードの扱いが異なりますよね? なんで?C++ の例で言うと、Derived もオーバーロードを許可する場合、'd->f(65.3)' は 'f(char c)' ではなく 'f(double x)' を呼び出します。
ありがとう、