Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Alvin Seville
334 / 266 / 132
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
1

Почему при восходящем приведении типов вызывается метод класса потомка?

07.10.2018, 16:51. Показов 1731. Ответов 5
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    class T1
    {
        public virtual void P()
        {
            Console.WriteLine(1);
        }
    }
    
    class T2 : T1
    {
        public override void P()
        {
            Console.WriteLine(2);
        }
    }
    
    class Program
    {   
        public static void Main(string[] args)
        {
            var x1 = new T2();
            x1.P();
            
            var x2 = (T1)new T2(); 
            x2.P();
            
            Console.ReadLine();
        }
    }
Почему во втором случае выведет 2?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2018, 16:51
Ответы с готовыми решениями:

Как вызвать метод дочернего класса при приведении типов?
Привет у меня есть класс (Батя) и парочка дочерних классов в классе Батя есть метод void...

Почему если при вызове метода Foo от типа B, в объекте класса FooImp вызывается метод от А?
Поясните пожалуйста, почему если при вызове метода Foo от типа B, в объекте класса FooImp...

FormatException не обработано при приведении типов
Надоело, просто жесть как надоело: err = Convert.ToInt32(hgg); ferrors = err; Ну что здесь...

Изменение значения при приведении типов
Привет форумчане! Вот часть программы: u = 64000; s = (short) u; console.Writeline("s после...

5
Эксперт .NET
15556 / 11806 / 3097
Регистрация: 17.09.2011
Сообщений: 19,718
07.10.2018, 16:59 2
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Почему во втором случае выведет 2?
Потому что метод переопределен — в этом вся суть переопределения.
0
Alvin Seville
334 / 266 / 132
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
07.10.2018, 17:01  [ТС] 3
Я думал, что выведет 1, так как я использовал приведение.
0
Эксперт .NET
15556 / 11806 / 3097
Регистрация: 17.09.2011
Сообщений: 19,718
07.10.2018, 17:03 4
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Я думал, что выведет 1
Если бы метод был не виртуальным или не переопределенным, то да, вывело бы 1.
А так будет выполняться метод фактического типа (или ближайшего переопределившего), на который ссылается переменная.

Ни в коем случае не путайте тип переменной и тип объекта, на который эта переменная ссылается.
Переменная x2 все равно ссылается на объект типа T2, хоть сама и имеет тип T1.
0
Alvin Seville
334 / 266 / 132
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
07.10.2018, 17:08  [ТС] 5
kolorotur, можно сказать, что оператор явного приведения типов влияет только на тип переменной?
0
Эксперт .NET
15556 / 11806 / 3097
Регистрация: 17.09.2011
Сообщений: 19,718
07.10.2018, 17:13 6
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
можно сказать, что оператор явного приведения типов влияет только на тип переменной?
Только если речь идет о ссылочных переменных и производится приведение от родителя к наследнику или наоборот.
В противном случае этот же синтаксис может иметь конвертация, при которой обычно создается новый экземпляр.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2018, 17:13

Не вызывается метод из базового типа после приведения типов?
При приведении типов от производного класса Manager к базовому классу Employee, у объекта "e" к...

Не могу понять почему не вызывается метод? Как вывести метод Plus?
namespace lesson3 { class Program { struct Complex { public double im;...

Почему в программе выводятся пустые поля для класса-потомка
Не могу понять, почему в программе выводятся пустые поля для класса-потомка (название, стоимость,...

Вызывается метод из базового класса
Имеется 2 класса: В 1 классе Data имеются такие методы: private string GetUpdateQuerryString()...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru