Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93

Виртуальные методы vs. сокрытие имен

13.11.2013, 22:30. Показов 3543. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Насколько я понял, виртуальный метод - это собственная вариация метода (аля перегрузка) производного класса. Но вот, что если взять и написать в наследуемом классе все тоже самое, только без virtual-override? Фактически произойдет сокрытие имени метода, но он также будет выполнять свои отдельные функции для объекта согласно того класса в иерархии, где он находится.
Вопрос: в чем же все-таки отличие? где я ошибаюсь?
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.11.2013, 22:30
Ответы с готовыми решениями:

Виртуальные методы и наследование
Здраствуйте. Не могли бы вы помочь добавить к этой программе наследование и виртуальные методы? using System; using...

Виртуальные статические методы
вычитал на стэковерфлоу что их не предусмотрено, т.к. противоречат принципам ооп и т.д.т.д. но например, есть класс, представляющий...

Upcasting и виртуальные методы
Всем привет Догадываюсь что сабж баян, но все-таки, оооочень прошу знающих "разжевать" что именно происходит в коде: class...

9
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.11.2013, 22:34
sergIKO, попробуйте угадать, что будет выведено на печать, а потом запустите на выполнение. Вопросы отпадут сами)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
 
namespace ConsoleApplication39
{
    class Program
    {
        static void Main()
        {
            Animal animal = new Cat();
            animal.Talk();
            animal.Eat();
 
            Console.WriteLine();
 
            Cat cat = (Cat) animal;
            cat.Talk();
            cat.Eat();
            Console.ReadKey();
        }
    }
 
 
    class Animal
    {
        public void Talk()
        {
            Console.WriteLine("Boo");
        }
 
        public virtual void Eat()
        {
            Console.WriteLine("MMmm");
        }
    }
 
    class Cat : Animal
    {
        public new void Talk()
        {
            Console.WriteLine("Mew");
        }
 
        public override void Eat()
        {
            Console.WriteLine("Sweet milk");
        }
    }
}
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
13.11.2013, 22:50
Виртуальные методу существуют НЕ для сокрытия имени метода, а для полиморфизма, читайте что такое полиморфизм.
0
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
13.11.2013, 23:03  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Вопросы отпадут сами)
их стало еще больше) запутался я что-то ..
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.11.2013, 23:06
sergIKO, ну сначала запутаетесь, а потом поймете. Всегда так.

Просто почитайте про виртуальные методы и зачем они нужны.
0
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
14.11.2013, 19:36  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
почитайте про виртуальные методы и зачем они нужны.
собственно с этого все и началось
...
пожалуй, еще раз перечитаю главу

Добавлено через 20 часов 16 минут
Psilon, вроде разобрался..правда есть пара вопросов:
1. Обнаружил, что во всех примерах обращение в виртуальному методу происходит через ссылку базового класса, которой до этого присваивают объект производного класса. То, что такая возможность предусмотрена, я знаю. Но, почему именно так? Почему бы не обратиться к экземпляру производного класса напрямую?

2.Cat cat = (Cat) animal; Я так понял, что это явное приведение типов? Т.е. аналог Cat cat = new cat(); ??
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
14.11.2013, 19:43
1. Обнаружил, что во всех примерах обращение в виртуальному методу происходит через ссылку базового класса, которой до этого присваивают объект производного класса. То, что такая возможность предусмотрена, я знаю. Но, почему именно так? Почему бы не обратиться к экземпляру производного класса напрямую?
а это вопрос, зачем нужны вообще базовые классы. Именно для этого. Зачем - ну тут придется немного повозиться, разбираясь. Посмотрите пример первый из книги "Паттерны проектирования" - про утку и её поведение. А то я не знаю, как объяснить Это слишком просто и слишком сложно. Короче - нужно интуитивное понимание. Определения "точки" не существует, но вы же знаете, что это такое. Тут примерно так же.

sergIKO,
Цитата Сообщение от sergIKO Посмотреть сообщение
2.Cat cat = (Cat) animal; Я так понял, что это явное приведение типов? Т.е. аналог Cat cat = new cat(); ??
это аналог
C#
1
2
int x = 5;
double b = (double) x;
ну если очень приблизительно. Хотя на самом деле, конечно, не аналог Но в первом приближении - так.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.11.2013, 19:50
Цитата Сообщение от sergIKO Посмотреть сообщение
Обнаружил, что во всех примерах обращение в виртуальному методу происходит через ссылку базового класса, которой до этого присваивают объект производного класса. То, что такая возможность предусмотрена, я знаю. Но, почему именно так?
Конкретно в примерах — чтобы продемонстрировать разницу между вызовом виртуального и скрытого метода

Цитата Сообщение от sergIKO Посмотреть сообщение
Почему бы не обратиться к экземпляру производного класса напрямую?
Потому что тот, кто будет обращаться к классу, скорее всего понятия не имеет о том, какой класс ему подсунут.
Простейший пример: Console.WriteLine. В него можно передать ссылку на абсолютно любой объект. Почему? Потому что у него есть перегрузка, принимающая на вход ссылку на object, а все объекты наследуются от этого типа. В это типе так же определен метод ToString который и вызывается из метода WriteLine.

Цитата Сообщение от sergIKO Посмотреть сообщение
Cat cat = (Cat) animal; Я так понял, что это явное приведение типов? Т.е. аналог Cat cat = new cat(); ?
Нет, это абсолютно не аналог.
В первом случае ссылки cat и animal ссылаются на один и тот же объект в памяти, а во втором случае создается абсолютно новый экземпляр.
0
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
14.11.2013, 20:04
sergIKO, еще один пример... надеюсь поймете
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
namespace ConsoleApplication14
{
    class Program
    {
        static void Main(string[] args)
        {
            Animal[] animals = new Animal[]
            {
                new Cat(),
                new Dog(),
                new Mouse()
            };
 
            Console.WriteLine("Сокрытие...");
            foreach (Animal an in animals)
            {
                an.NameSokritie();
            }
 
            Console.WriteLine("\nПолиморфизм...");
            foreach (Animal an in animals)
            {
                an.NamePolimorfizm();
            }
 
            Console.ReadKey();
        }
    }
 
    class Animal
    {
        public void NameSokritie()
        {
            Console.WriteLine("Some animal");
        }
 
        public virtual void NamePolimorfizm()
        {
            Console.WriteLine("Animal");
        }
    }
 
    class Cat : Animal
    {
        public new void NameSokritie()
        {
            Console.WriteLine("Cat");
        }
 
        public override void NamePolimorfizm()
        {
            Console.WriteLine("Cat");
        }
    }
 
    class Dog : Animal
    {
        public new void NameSokritie()
        {
            Console.WriteLine("Dog");
        }
 
        public override void NamePolimorfizm()
        {
            Console.WriteLine("Dog");
        }
    }
 
    class Mouse : Animal
    {
        public new void NameSokritie()
        {
            Console.WriteLine("Mouse");
        }
 
        public override void NamePolimorfizm()
        {
            Console.WriteLine("Mouse");
        }
    }
}
0
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
14.11.2013, 20:24  [ТС]
Всем спасибо Понимание есть...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2013, 20:24
Помогаю со студенческими работами здесь

Полиморфизм. Виртуальные методы
Здраствуйте уважаемые админы!!У меня проблемы:swoon: с некоторыми предметами,у меня к вам очень большая просьба помогите с лабой...

Виртуальные методы. Перекрытие методов.
Гетерогенная ЛВС состоит из различных устройств: коммутаторы, маршрутизаторы, хосты, принтера. Взаимодействие между объектами ...

Скрыть виртуальные наследуемые методы
Делаю кароч либу, но вот хочу у наследуемых классов скрыть методы от родительского класса. Ну вот тип пример class Parent ...

Виртуальные методы,с комментариями пожалуйста
Родительский класс:Вектор(поле-название) Потомки: (Двумерный вектор(поля:компоненты вектора), Трехмерный вектор(поле размерность)). ...

Виртуальные методы и юнит-тесты
В C# пришел недавно из Java, где все методы виртуальные. И сразу столкнулся с тем, что в C# по умолчанию методы невиртуальные, более того,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru