Так что я играл с 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
Таким образом, очевидно, что это подразумевает неявно преобразованное int, чтобы удвоить более конкретный Foo (int) из базового класса. Или он скрывает Foo (int) от базового класса? Но тогда: почему не скрывается Foo (строка)? Чувствует себя очень непоследовательно ... Также не имеет значения, переопределяю ли я Foo (int) или нет; результат тот же. Может ли кто-нибудь объяснить, что здесь происходит?
(Да, я знаю, что это плохая практика, перегружать базовые методы в производном классе - Лисков и все - но я до сих пор не было бы ожидать, что Foo (INT) в OverriddenDerivedClass не называется ?!)
это там, прокрутите вниз – ose
. «Да, я знаю, что это плохая практика, перегружать базовые методы в производном классе - Лиск и все» Да что когда? вам разрешено переопределять базовые методы? В любом случае +1, потому что я ожидал бы того же, любопытного для ответа. – bas
Конечно, вы хотели вызвать методы из 'overrideDerived' во второй партии, не так ли? – Rotem