だから私はこの投稿からC++の動作と一致するかどうかを確認するためにC#で遊んでいました: http ://herbsutter.com/2013/05/22/gotw-5-solution-overriding-virtual-functions/行動:
public class BaseClass
{
public virtual void Foo(int i)
{
Console.WriteLine("Called Foo(int): " + i);
}
public void Foo(string i)
{
Console.WriteLine("Called Foo(string): " + i);
}
}
public class DerivedClass : BaseClass
{
public void Foo(double i)
{
Console.WriteLine("Called Foo(double): " + i);
}
}
public class OverriddenDerivedClass : BaseClass
{
public override void Foo(int i)
{
base.Foo(i);
}
public void Foo(double i)
{
Console.WriteLine("Called Foo(double): " + i);
}
}
class Program
{
static void Main(string[] args)
{
DerivedClass derived = new DerivedClass();
OverriddenDerivedClass overridedDerived = new OverriddenDerivedClass();
int i = 1;
double d = 2.0;
string s = "hi";
derived.Foo(i);
derived.Foo(d);
derived.Foo(s);
overridedDerived.Foo(i);
overridedDerived.Foo(d);
overridedDerived.Foo(s);
}
}
出力
Called Foo(double): 1
Called Foo(double): 2
Called Foo(string): hi
Called Foo(double): 1
Called Foo(double): 2
Called Foo(string): hi
したがって、基本クラスからのより具体的な Foo(int) よりも、暗黙的に変換された int を double に優先するようです。または、基本クラスから Foo(int) を非表示にしますか? しかし、その後: Foo(string) が非表示にならないのはなぜですか? 非常に矛盾しているように感じます... Foo(int) をオーバーライドするかどうかも問題ではありません。結果は同じです。ここで何が起こっているのか誰か説明できますか?
(はい、派生クラス (Liskov など) で基本メソッドをオーバーロードするのは悪い習慣であることはわかっていますが、それでも OverriddenDerivedClass の Foo(int) が呼び出されないとは思いませんか?!)