c # переопределить ключевое слово - PullRequest
2 голосов
/ 28 октября 2010

Я хочу знать, если я не поставлю override ключевое слово перед методом в методе производного класса m1(), тогда каково значение по умолчанию перед этим, или оно выдаст ошибку времени компиляции?

class A { virtual void m1(){} }
class B: A { void m1(){} }

Ответы [ 3 ]

8 голосов
/ 28 октября 2010

Во-первых, вы получите ошибку во время компиляции, потому что virtual члены не могут быть приватными, что A.m1 как написано.

Во-вторых, как только вы исправите это, вы получите компиляциюпредупреждение о том, что B.m1 скрывает унаследованный элемент A.m1.

В-третьих, если вы сделаете что-то подобное:

A a = new B();
a.m1();

Это вызовет A.m1, тогда как если вы вставите override в определении B.m1, тогда приведенное выше вызовет B.m1.Однако, если вы вставите new в определение B.m1, то приведенное выше все равно вызовет A.m1, но пропустит предупреждение во время компиляции.

2 голосов
/ 28 октября 2010

Без override компилятор выдает предупреждение, насколько я помню. В этом случае метод рассматривается так, как если бы он имел модификатор new.

1 голос
/ 28 октября 2010

Когда вы компилируете, вы получите предупреждение о том, что B.m1() скрывает унаследованный элемент A.m1().

Вам следует использовать ключевое слово new, если вы хотите разорвать цепочку наследования, или использовать переопределение, чтобы получить свое виртуальное поведение.

...