Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2011, 15:56   #1
peplenko
Пользователь
 
Регистрация: 03.05.2010
Сообщений: 23
По умолчанию Виртуальные методы

Для начала:
Код:
using System;
// compile with: /unsafe
class Example
{
   
   
    public virtual int VirtMethod(int Var)
    {
        return Var + 10;
    }
 

};
class ChildExample : Example
{
    public virtual int VirtMethod(int Var)
    {
        return Var + 15;
    } 
};
class SecondClass
{

    public static void Main()
    {
        Method();
    }
    unsafe public static void Method()
    {
        ChildExample* chobj = new ChildExample();
        Example* obj = chobj;
        
        Console.WriteLine(obj->VirtMethod(5));
        Console.ReadKey();
    }
 
   
};
не работает. пишет Cannot take the address of, get the size of, or declare a pointer to a managed type ('ChildExample')

Суть вопроса: вообще-то можно делать указатели на пользовательский тип? Кроме структуры? И если нет, то в чём польза вирт. методов?

спасибо
peplenko вне форума Ответить с цитированием
Старый 08.04.2011, 16:10   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

виртуальный чтобы в дочернем классе переопределить его - вместо virtual ставится override
и точку с запятой не нужно в конце класса

Код:
class ChildExample : Example
{
    public override int VirtMethod(int Var)
    {
        return Var + 15;
    } 
}
если Example нигде напрямую не будет юзаться, то его можно как abstract объявить
soleil@mmc вне форума Ответить с цитированием
Старый 08.04.2011, 16:19   #3
peplenko
Пользователь
 
Регистрация: 03.05.2010
Сообщений: 23
По умолчанию

Ну я понимаю для чего он вообще. Но для чего он в языке, который не позволяет использовать класс как тип указателя. Только для унификации разве что.
По-поводу оверрайд и точки-с-запятой спасибо, видимо шарп всё же ближе к яве.
peplenko вне форума Ответить с цитированием
Старый 08.04.2011, 16:52   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> который не позволяет использовать класс как тип указателя

всё он позволяет, просто не нужно unsafe пользоваться

Код:
ChildExample* chobj = new ChildExample();
        Example* obj = chobj
этот ужос вобще зачем? без звёздочек небеса упадут?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.04.2011, 17:04   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

действительно, для чего нужен такой шиворот-навыворот описанный в Method() ?
тебе нужно вызвать базовый метод VirtMethod()?
есть же правила приведения к базовому/производному классу
soleil@mmc вне форума Ответить с цитированием
Старый 08.04.2011, 17:16   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

вот пример, который делает то же самое, только без unfase:

Код:
namespace ConsoleApplication1
{
    class TParent {

        public virtual int VirtMethod(int Var)
        {
            return Var + 10;
        }
    }

    class TChild : TParent {

        public override int VirtMethod(int Var)
        {
            return Var + 15;
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            TChild child = new TChild();
            TParent parent = child;

            Console.WriteLine(parent.VirtMethod(5));
        }
    }
}
unsafe — это вобще такой костыль и дырка в голову одновременно. Пользоваться им нужно только в крайних случаях, когда без указателей ну вобще никак. Причём с 70% нативного виндового API, которое требует только указателей, можно спокойно общаться через маршаллинг без всяких unsafe.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.04.2011, 17:19   #7
peplenko
Пользователь
 
Регистрация: 03.05.2010
Сообщений: 23
По умолчанию

wut? Как пользоваться указателями без unsafe? Мне нужно продемонстрировать работу вирт. методов. Чтобы вызывался переопределенный метод невзирая на тип указателя.
peplenko вне форума Ответить с цитированием
Старый 08.04.2011, 17:38   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Чтобы вызывался переопределенный метод невзирая на тип указателя.

вы мой пример запускали? он вам 20 выдал? это переопределённый метод? не взирая на тип TParent parent? Каким боком тут указатели?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.04.2011, 04:40   #9
peplenko
Пользователь
 
Регистрация: 03.05.2010
Сообщений: 23
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> Чтобы вызывался переопределенный метод невзирая на тип указателя.

вы мой пример запускали? он вам 20 выдал? это переопределённый метод? не взирая на тип TParent parent? Каким боком тут указатели?
Ваше сообщение после увидел. Спасибо.
peplenko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему виртуальные методы и деструкторы нельзя делать шаблонными??? mike_tihomirov Общие вопросы C/C++ 3 14.12.2010 15:03
Виртуальные методы Kn793 Общие вопросы C/C++ 5 26.06.2010 15:08
Виртуальные системы. jojahti Софт 12 27.01.2010 14:54
Виртуальные функции bigory Помощь студентам 2 06.06.2009 22:44
Полиморфизм и виртуальные методы Викдон Общие вопросы Delphi 1 02.02.2009 04:40