Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
thick_int
Заблокирован
#1

Полимморфизм - C++

03.02.2012, 10:51. Просмотров 1038. Ответов 26
Метки нет (Все метки)

Возможность обращаться к подклассам через классс, от которого эти подкласы наследуют, - это и все на что способен полиморфизм или же есть нечто более глубокое в этом понятии?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
03.02.2012, 13:46 #16
thick_int, В С++ тоже предусмотрен override и new. В С++11 соответственно.
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
03.02.2012, 13:48 #17
thick_int, представленный мной выше код эквивалентен такому коду на C#:
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
using System;
 
class Base
{
    public virtual void func()
    {
        Console.WriteLine("Base.func()");
    }
}
 
class Derived1 : Base
{
    public override void func()
    {
        Console.WriteLine("Derived1.func()");
    }
}
 
class Derived2 : Derived1
{
    public override void func()
    {
        Console.WriteLine("Derived2.func()");
    }
}
 
class MainClass
{
    static void Main()
    {
        Base[] arr = {new Base(), new Derived1(), new Derived2()};
 
        foreach (Base i in arr)
            i.func();
    }
}
0
thick_int
Заблокирован
03.02.2012, 13:49  [ТС] #18
Ну у меня по первости (поправьте, если ошибаюсь) сложилось такое впечатление, что руки у полиморизма очень короткие. То есть он нормально действует только на уровне:

Базовый классс --> Производный класс

и уже как бы сбоит на уровне:

Базовый классс --> Производный класс --> Более глубокий производный класс.

А почему так нельзя

C#
1
2
3
4
5
6
7
class Derived1 : Base
{
    public virtual override void func()
    {
        Console.WriteLine("Derived1.func()");
    }
};
чтобы ясно было видно, что чего переопределяет.
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
03.02.2012, 14:05 #19
thick_int, потому что virtual и override не совместимы.
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
03.02.2012, 14:13 #20
thick_int, и так видно, что чего переопределяет. В базовом классе сказали, что метод виртуальный, а в производном сказали, что переопределили метод базового.
0
thick_int
Заблокирован
03.02.2012, 14:16  [ТС] #21
А в следующем по глубине производном классе, надо понимать так, что переопределяется САМЫЙ-САМЫЙ базовый метод?
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
03.02.2012, 14:19 #22
thick_int, Очевидно же. Ибо в производном классе не помечен метод как virtual не так-ли?
0
thick_int
Заблокирован
03.02.2012, 14:43  [ТС] #23
Цитата Сообщение от ForEveR Посмотреть сообщение
Очевидно же
Ну Вам то оно может и оччевидно, а я вот только только начал это смотреть и мне это не очень показалось очевидным.
А вот такая конструкция, как
C#
1
base.func()
она вообще сразу как то дает понять, что переопределяется не самый базовый, а непосредственно предшествующий метод. Ну вот сами посудите, вот с первого взгляда мне вот так и показалось.
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
03.02.2012, 15:51 #24
thick_int, как эта конструкция (вызов метода непосредственного базового класса) связана с переопределением виртуальных методов?
0
thick_int
Заблокирован
03.02.2012, 16:32  [ТС] #25
Ну так мне и показалось, что точно по такой же схеме (только назад) происходит и переопределение виртуальных методов.
Ну вообще то логично ведь представлять, что метод в производном классе переопределяет метод в том классе, от которого он непосредственно наследует.
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
03.02.2012, 17:17 #26
thick_int, нет. Потому что тогда полиморфизм нафиг не нужен, ибо он никаким полиморфизмом (многообразием форм) являться уже не будет.
1
thick_int
Заблокирован
03.02.2012, 17:27  [ТС] #27
Ну значит это моя ошибка. Спасибо за разъяснения.
Я читаю два учебника параллельно и оба на английском вот этого автора Andrew Troelsen.
0
03.02.2012, 17:27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru