Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как закастить сложные наследования / 7 сообщений из 7, страница 1 из 1
24.11.2012, 14:54
    #38051657
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закастить сложные наследования
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <iostream>

class A {  };
class B {  };
class C {  };

class D : public A, public B {  };
class E : public A, public C, public B {  };

int main()
{
    E* e = new E;
    D* d = dynamic_cast<D*>(e); // why not ??????
    return 0;
}
...
Рейтинг: 0 / 0
24.11.2012, 15:13
    #38051664
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закастить сложные наследования
Lumix, как это "why not"?? класс E не входит в иерархию наследования класса D, с каких хренов они должны друг в друга кастоваться то?
...
Рейтинг: 0 / 0
24.11.2012, 15:19
    #38051667
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закастить сложные наследования
egorychLumix, как это "why not"?? класс E не входит в иерархию наследования класса D, с каких хренов они должны друг в друга кастоваться то?

А что компилятор настолько туп, чтобы увидеть, что E = D + C ?????
...
Рейтинг: 0 / 0
24.11.2012, 15:34
    #38051673
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закастить сложные наследования
Lumix,

dynamic_cast не работает без виртуальных функций в базовом классе.
RTFM.
...
Рейтинг: 0 / 0
24.11.2012, 15:50
    #38051676
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закастить сложные наследования
Anatoly Moskovsky,

про виртуальные функции понял.

А в С++ есть разница между public A, public B и public B, public A ??
...
Рейтинг: 0 / 0
24.11.2012, 15:50
    #38051677
sherzod_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закастить сложные наследования
Lumix,

Компилятор достаточно умен чтобы понять то, что вы не видите. А именно что класс Е, говоря языком явистов или шарпистов "не реализует интерфейс" класса D. Остальное его интересовать и не должно. При условии наличия виртуального метода в каком нибудь из базовых классов, вы можете сделать это сами, по пройдясь кастами по разрешенному пути:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class A {  virtual void dosmth() {} };
class B {  };
class C {  };

class D : public A, public B {  };
class E : public A, public C, public B {  };

int main()
{
    E* e = new E;
    D* d = dynamic_cast<D*>(static_cast<A*>(e));
    return 0;
}
...
Рейтинг: 0 / 0
24.11.2012, 15:59
    #38051679
sherzod_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закастить сложные наследования
Lumix,

PS. Немного подумав решил что утверждение "класс Е не реализует интерфейс класса D" требует разъяснения, так как именно его непонимание привело к теме. Указанное вами приведение кажется вам возможным, в указанной вами конфигурации, так как оба класса пустые и кажется что D реализует подмножество операций E. Как только вы начнете добавлять в них функции и переменные эта иллюзия будет разрушена и классы разойдутся.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как закастить сложные наследования / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]