powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как закастить сложные наследования
7 сообщений из 7, страница 1 из 1
Как закастить сложные наследования
    #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
Как закастить сложные наследования
    #38051664
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, как это "why not"?? класс E не входит в иерархию наследования класса D, с каких хренов они должны друг в друга кастоваться то?
...
Рейтинг: 0 / 0
Как закастить сложные наследования
    #38051667
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychLumix, как это "why not"?? класс E не входит в иерархию наследования класса D, с каких хренов они должны друг в друга кастоваться то?

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

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

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

А в С++ есть разница между public A, public B и public B, public A ??
...
Рейтинг: 0 / 0
Как закастить сложные наследования
    #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
Как закастить сложные наследования
    #38051679
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

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


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