powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / К виртуальным функциям
25 сообщений из 106, страница 4 из 5
К виртуальным функциям
    #39417486
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercury,

1) Когда я вижу a.xxx или a->xxx то я ожидаю, что вызовется xxx именно у того класса, на экземпляр которого указывает a (или сам им является). В С++ это так и есть для полей и виртуальных функций. А для обычных функций класса - нет, даже если наследник переопределил функцию.

2) виртуальные функции - это в сочетании с наследованием в С++ необходимый и достаточный инструмент для реализации концепции интерфейсов. Так что что почти в любой программе в которой больше одного модуля они используются.

Да, я с вами согласен, но мне было интересно другое. Если бы вы в 1982 участвовали в разработке С++, и пусть на том этапе вы также бы отказались от RTTI (пусть позже она и будет добавлена) и пришли к статическому контролю типов и виртуальным функциям(одно собственно вытекает из другого), то какой на тот момент была бы логичной с вашей точки зрения обработка ситуации кода ниже?

Код: plaintext
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.
class X
{
	int x;
public:
	virtual void copy(X* p)
	{
		x = p->x;
	}
};

class XX : public X
{
	int xx;
public:
	virtual void copy(XX* p)
	{
		xx = p->xx;
		X::copy(p);
	}
};

void f(X a, XX b)
{
	a.copy(&b);//1
	b.copy(&a);//2
}



Окей, пусть строчка 1 будет корректной, в a.x будет передан b.x. Но из каких соображений было принято решение о сокрытии copy базового класса в классе B мне не очень понятно. Произошло бы частичное изменение состояния b и что в этом страшного?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417488
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. мне понятно, что a может указывать на объект класса B, и тогда будет неоднозначность при вызове b.copy(&a) - какой именно copy B использовать, но с другой стороны, неужели сокрытие было единственным выходом?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417491
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercury, у меня нет ненависти к ООП. У меня есть бесконечное изумление.
ООП - это всего лишь технический приём. Фича. Коих в современном ЯП более
сотни. Но мы с упорством почитателей карго-культа из раза в раз поднимем
один и тот-же топик. Неужели нельзя почитать спеку? Сдедать макет. Runn-ить
1 раз и сделать вывод. Дада. Я плюсую даже за последний кейс. И я-бы так
поступил. И это правильно. Программирование это инженерное исскусство.

Ребята! Инженеры! Коллеги. Неужели у вас нет других тем? Откройте новости
науки и техники. Миссия на Марс. Исследование снимков космоса. Новые открытия
в области ракетных двигателей. Интернет вещей. Диагностика сердечных заболеваний
по сведениям от пульсомеров. Современная математика. Проблемы Гильберта
которые не решены. Языки программирования. Мартин Одерский создает
salable language который вобрал в себя все парадигмы всех языков. Новые
модели мультизадачности. Акторы. Которые мы обсуждаем в смежном топике.
Квантовые вычисления. Нейронные сети. Машииное зрение. Роевый интеллект.

Здесь есть релевантные к С++ темы! Да есть! Есть библиотеки. Фреймворки. Есть юзкейсы.

Но неужели чорт вас возьми, господа мы 30 лет будем обсуждать этот технический
приём с двумя классами!?

Это знаете-ли как в университете на курсе матана внезапно обратиться к профессуре
с вопросом о решении квадратных уравнений. Это пошло. И стыдно.


Пошло и стыдно изменять тому человеку, которого любишь, а в том чтобы задавать вопросы или даже, например, работать проституткой нет ничего такого пошлого или стыдного. У вас есть возможность в любой момент закрыть любой топик в Сообществе CPP, потому мне не понятно почему вы выносите это на публичное обсуждение.

maytonЧто за топик? Если мы его закрыли то видимо на то были основания.
Подними ее снова но в нужном подфоруме и с нужной фомулировкой.

Подчеркнутое я считаю как-бы брошенным упреком. Дескыть здесь (в sql.ru)
что-то неправильно модерируют и кого-то избирательно обижают.

Он был удален даже, это было поздравительная новогодняя задача Сообществу на 2016 год)) Брошенный упрек был в конце 2016, а не сейчас)))
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417494
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Пошлость означает в данном контексте - прошлое. Прошедшее. Обыденное.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417584
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпусть на том этапе вы также бы отказались от RTTI (пусть позже она и будет добавлена) и пришли к статическому контролю типов и виртуальным функциям
Без RTTI нельзя реализовать виртуальные функции.
SashaMercuryНо из каких соображений было принято решение о сокрытии copy базового класса в классе B мне не очень понятно.
Во-первых это не имеет отношение к вирт. функциям. Эта фича про перегрузку любых наследованных функций.
Почему ее сделали - без понятия. Наверно чтобы потомок мог перехватывать перегрузки предка одной обобщенной функцией. А если ему это не надо то он может подключить перегрузки предка через using.

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

Anatoly MoskovskyБез RTTI нельзя реализовать виртуальные функции.

Не очень понимаю, BS напротив разделяет эти понятия. RTTI был добавлен только в 1991-1992 году совместно с Лисенковым
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417623
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417624
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury Лисенковым
Ленковым
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417653
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryRTTI был добавлен только
Возможно позже был добавлен интерфейс к RTTI через dynamic_cast и typeid.
Но сам RTTI как механизм различения классов в рантайме существовал, иначе в рантайме никак не определить какого класса функцию надо вызвать для данного указателя.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417674
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryRTTI был добавлен только
Возможно позже был добавлен интерфейс к RTTI через dynamic_cast и typeid.
Но сам RTTI как механизм различения классов в рантайме существовал, иначе в рантайме никак не определить какого класса функцию надо вызвать для данного указателя.

Безусловно такой механизм существовал, но я имел ввиду то, что при разработке виртуальных функций в С++, стоял вопрос о не предоставлении программисту api в виде, например, dynamic_cast, typeid, type_info, и было принято решение отказаться от добавления такого вида интерфейса в силу того, что вместо грамотного(как полагал BS) проектирования и декомпозиции классов, программисты писали бы код подобный такому
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417768
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryRTTI был добавлен только
Возможно позже был добавлен интерфейс к RTTI через dynamic_cast и typeid.
Но сам RTTI как механизм различения классов в рантайме существовал, иначе в рантайме никак не определить какого класса функцию надо вызвать для данного указателя.
Для реализации мех-ма виртуальных функций достаточно таблицы указателей на них.

RTTI это немного более широкий механизм, который уже может определять например, наследование.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417796
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglДля реализации мех-ма виртуальных функций достаточно таблицы указателей на них.
Указатель vtable это и есть весь RTTI который существует в С++ на данный момент.
SiemarglRTTI это немного более широкий механизм, который уже может определять например, наследование.
Может в каком-то другом языке, но не в С++ ))
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417808
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Не согласен

1. type_info не хранится в VMT

2. для downcast и cross-cast, информации VMT недостаточно (это я и имел в ввиду про определение наследования)

Сейчас я уже не полезу в потроха, но на первый взгляд должно быть так
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417809
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любопытство замучило. Значит так, для GCC
Код: plaintext
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.
.L17:
        push    0
        push    OFFSET FLAT:typeinfo for Derived
        push    OFFSET FLAT:typeinfo for Base
        push    eax
        call    __dynamic_cast
        add     esp, 16
        jmp     .L14
.L13:
        mov     eax, 0
.L14:
        mov     DWORD PTR [ebp-20], eax
..........
vtable for Derived:
        .long   0
        .long   typeinfo for Derived
        .long   Base::vvfunc()
vtable for Base:
        .long   0
        .long   typeinfo for Base
        .long   Base::vvfunc()
typeinfo for Derived*:
        .long   vtable for __cxxabiv1::__pointer_type_info+8
        .long   typeinfo name for Derived*
        .long   0
        .long   typeinfo for Derived
typeinfo name for Derived*:
        .string "P7Derived"
typeinfo for Base*:
        .long   vtable for __cxxabiv1::__pointer_type_info+8
        .long   typeinfo name for Base*
        .long   0
        .long   typeinfo for Base
typeinfo name for Base*:
        .string "P4Base"
typeinfo for Derived:
        .long   vtable for __cxxabiv1::__si_class_type_info+8
        .long   typeinfo name for Derived
        .long   typeinfo for Base
typeinfo name for Derived:
        .string "7Derived"
typeinfo for Base:
        .long   vtable for __cxxabiv1::__class_type_info+8
        .long   typeinfo name for Base
typeinfo name for Base:
        .string "4Base"

typeinfo - это отдельный массив для класса, в котором есть ссылка на vtable

dynamic_cast это по факту вызов функции с 4мя параметрами - указатель на объект, два указателя на typeinfo и 0 (может для каких-то случаев)

Так что RTTI > VMT
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417901
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercury, у меня нет ненависти к ООП. У меня есть бесконечное изумление.
ООП - это всего лишь технический приём. Фича. ...

Ребята! Инженеры! Коллеги. Неужели у вас нет других тем? Откройте новости
науки и техники. Миссия на Марс. Исследование снимков космоса. Новые открытия
...

Здесь есть релевантные к С++ темы! Да есть! Есть библиотеки. Фреймворки. Есть юзкейсы.

Но неужели чорт вас возьми, господа мы 30 лет будем обсуждать этот технический
приём с двумя классами!?

...

Да, Марк абсолютно прав. Неправ только в одном -- обсуждать-то можно, если есть непонимание чего-то или незнание.
Но философски рассуждать на эту тему -- да, особого смысла нет.

Кстати, я за последние полгода сделал один расчётный сервис, так что удивительно, сам он написан практически вообще без ООП, там есть 4 класса, созданные искусственно и абсолютно произвольно, и используемые скорее для организации кода, чем для решения каких-то задач. Всё остальное -- просто функции, лямбды и вэльютайпы. Сервис был списан с аналогичного другого сервиса на питоне.
Очень хорошо получилось -- ну не нужно там ООП!
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417903
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymasterziv, во времена появления С++, наверное,
разработчики боялись всего-всего, и я полагаю, что Страустрап просто остерёгся делать все поголовно функции виртуальными.


Не знаю как я сразу не прочитал. BS действительно упоминает о том, насколько настороженно общественность отнеслась к виртуальным функциям. Спасибо!

Ну я этого не знал, это была просто догадка.
С другой стороны, я же тоже ТОГДА программировал, тоже всего боялся :-)
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417907
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryAnatoly Moskovsky,

Anatoly MoskovskyБез RTTI нельзя реализовать виртуальные функции.

Не очень понимаю, BS напротив разделяет эти понятия. RTTI был добавлен только в 1991-1992 году совместно с Лисенковым

Как бы да, но он видимо разделяет именно RTTI как фичу, а не как идею, она действительно появилась позже, хотя многие фреймворки (MFC, QT) уже делали давно свой RTTI на базе -- не поверишь -- ВИРТУАЛЬНЫХ ФУНКЦИЙ!

По сути-то и RTTI, и виртуальные методы -- это динамический полиморфизм в рантайм.
Так что Анатолий прав, и я тоже был удивлён твоим постом.

В С++ есть статический полиморфизм, и динамический. RTTI, виртуалные методы -- проявление динамического.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417928
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglТак что RTTI > VMT
Нет.
В т.н. RTTI не содержится ничего стандартного. Даже формат имени которое возвращается никто не гарантирует
Если посмотреть на интерфейс type_info то все его поля и методы можно реализовать на основе компайлтайм информации. Реализация может например в качестве имени применить HEX значение указателя vtable, и никакой реальной структуры хранить не надо.
Так что type_info это так, компайл-тайм затычка. Да не все объекты хранят этот самый type_info. Когда мы вызываем typeid() для объекта, то только объект с виртуальными функциями умеет в рантайме извлекать type_info, а остальные это делают в компайлтайме. Что как бы немного противоречит первым двум буквам RTTI ))

А вот vtable для объекта известен только в рантайме - он и есть настоящий RTTI.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418182
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Ты опустил вторую часть - про dynamic_cast, поскольку надо разобраться по таблицам (по vtable'м, да), кто чей отец, Люк.
И только она остается неразрешаемой на этапе компиляции, вот она и есть RTTI.

Кстати, это очень дорогая операция - на стековерфлоу были тесты, показывающие что dynamic_cast в 20 раз медленнее, чем сравнение typeinfo
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418189
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть соврал - typeid(obj) тоже выполняет поиск по таблицам в рантайме, если obj имеет виртуальные ф-ции. Так что тоже run-time функция.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418446
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglТы опустил вторую часть - про dynamic_cast, поскольку надо разобраться по таблицам (по vtable'м, да), кто чей отец, Люк.
И только она остается неразрешаемой на этапе компиляции, вот она и есть RTTI.
Да не надо ничего такого для работы dynamic_cast (компилятор, зная тип может без всякого рантайма увидеть кто предки и как привести от предка к наследнику - нужен только vtable и выводимый из него тип). Но в то что какой-то компилятор с дуру делает какие-то множественные лукапы - верю ))
Но к RTTI это не имеет отношения.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418473
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по указателю - в compile-time обычно не может
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418515
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglпо указателю - в compile-time обычно не может
Осталось привести пример того, что именно не может ))
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418538
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Элементарно
Код: plaintext
1.
2.
3.
4.
5.
void myfunc(Base *pb)
{
   Derived *px = dynamic_cast<Derived*>(pb);
....
}
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418555
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglпо указателю - в compile-time обычно не можета я пытался сделать динамическую типизацию на момент компиляции, как бы странно это ни звучало 20256178

и у меня есть идеи для улучшения
...
Рейтинг: 0 / 0
25 сообщений из 106, страница 4 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / К виртуальным функциям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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