powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / К виртуальным функциям
106 сообщений из 106, показаны все 5 страниц
К виртуальным функциям
    #39408801
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте C:
Продолжаю изучать D&E BS и некоторые ранние статьи BS. Книга, как я и говорил ранее, великолепная, другой эпитет подобрать трудно. Объем нюансов возникающих при проектировании и разработке языка огромный, не буду их перечислять - те, для кого этот топик вероятно знакомы с ними, а даже если не знакомы, то лучше BS я все равно не напишу. У меня много вопросов, на мой личный взгляд это интересные, хорошие вопросы. И позже, я планировал сделать какую-то отдельную тему посвященную этой книге, но поскольку график слишком плотный, то я понимаю, что времени на это может просто не хватить, да и такие большие топики не всегда приветствуются, что возможно и правильно. Потому пока не время для "всех вопросов".

BS отдает виртуальным функциям центральную роль при программировании на С++ и именно реализация такого рода концепции является одним из главных шагов для рождения С++ из C with Сlasses. Выше нужно сделать акцент на слове "реализация", я намеренно не использовал слово "появление". Данный раздел я решил посвятить виртуальным функциям, уже несколько дней они не дают мне спокойно думать о чем-то другом. Точнее не они, а история их реализации в С++.

1. Пусть у нас была бы возможность повлиять на реализацию языка. Представьте, что вы встретили листинг (D&E, BS)

Код: 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, 2, и, самое главное, почему? (вопрос не о том, как сейчас будет происходить обработка данного кода). При этом, было бы интересно узнать о ваших мыслях не в контексте того, что сейчас есть в С++, а в контексте того, что у вас есть C with Сlasses и вы планируете интегрировать к данному языку механизм виртуальных функций.

2. Как часто вы используете виртуальные функции в своих программах и как лично вы относитесь к данному механизму?
3. Считаете ли вы ослабление правил замещения для типа возвращаемого значения и для аргументов правильным решением? Интересно, если бы комитет не принял предложения об этом, каким образом были бы решены возможные проблемы(пример из теории компиляторов, метод clone в базовом и производных классах). Лично мне кажется, что это привело бы к изменениям в системе типов языка, что в конечном счете могло положительно сказаться на ней.

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

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

2) виртуальные функции - это в сочетании с наследованием в С++ необходимый и достаточный инструмент для реализации концепции интерфейсов. Так что что почти в любой программе в которой больше одного модуля они используются.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39408813
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКакой результат на ваш взгляд было бы логично ожидать в строчках 1, 2, и, самое главное,
почему?

Лично я бы ожидал, что ошибка компиляции возникнет ещё раньше, когда идёт переопределение
метода с другой сигнатурой. Но кое-кто при разработке языка пожадничал на явное указание
overload/override и в результате мы имеем отличное логово для багов.

PS: override таки появился в С++11 и лично я его использую повсеместно, где хочу именно
перекрыть метод.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39408868
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Параллельное наследование насколько мне известно не реализовано ещё ни в одном языке к сожалению. Всё ложится на плечи программиста на уровне "я знаю что класс А всё таки класс Б"
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39408885
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
" для рождения С++ из C with Сlasses"
20 лет назад я учился именно такому С++. Большинство фишек из 11,14, 17 версий уводят все дальше от этого базового уровня. Становясь более мощным, язык позволяет все более сложные концепции и приемы, это повышает требования к программистам, уменьшает их число, повышает порог вхождения, но от возможности выстрелить в ногу так и не избавляет полностью.
Мне кажется, что современный С++ можно рассматривать как ветку от базового, направленную в сторону расширения возможностей языка. И что есть потребность в языке, который был бы другой веткой от базового С++, в котором меньше было бы всяких возможностей в духе Алексндреску, но который был бы надежнее, но без реализации через виртуальную машину (как Java), с сохранением и производительности и возможностью работы с иерархиями классов. Одной из основных возможностей повышения надежности мне кажется контроль работы экземпляров классов только в своей памяти, иное - только через специальные атрибуты. Чтобы в ран-тайме можно было бы включить такой режим контроля, доступна только своя память (и аргументы функций как пример средства реализации возможностей программы). Мне кажется что такой "более надежный но менее навороченный С++/С_с_классами" лучше подошел бы для всяких десктопных приложений, чем Java или C#, например те же десктопные игровые клиенты. Не уверен, может быть Objective C несет в себе что-то такое, давно не смотрел в ту сторону, да и на Windows с ним проблемы, а больше ничего похожего вообще в голову не приходит.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39408946
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teo609,

Держи ,,,,,,,,,,,,

googlethis: dlang, golang, nimlang, rust
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39408972
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
2) виртуальные функции - это в сочетании с наследованием в С++ необходимый и достаточный инструмент для реализации концепции интерфейсов. Так что что почти в любой программе в которой больше одного модуля они используются.

нет, это не так. можно программировать вообще без виртуальных функций, на шаблонном полиморфизме, на современном С++ еще на лямбдах, и чем новее версия языка, тем более он нас к этому стимулирует.

Виртуальные функции нужны только когда у вас в программе есть иерархии классов.

Кстати, я видел в сети предложение в стандарт для реализации в С++ множественной диспетчеризации в виртуальных методах, вот это была бы бомба!
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409124
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class X
{
	int x;
public:
	virtual void copy(X* p)
	{
		x = p->x;
	}
};



Какой результат на ваш взгляд было бы логично ожидать в строчках 1, 2, и, самое главное, почему? (вопрос не о том, как сейчас будет происходить обработка данного кода). При этом, было бы интересно узнать о ваших мыслях не в контексте того, что сейчас есть в С++, а в контексте того, что у вас есть C with Сlasses и вы планируете интегрировать к данному языку механизм виртуальных функций.


По классике это должен был бы быть

Код: plaintext
1.
virtual X& operator =(const X& p);





И как раз в тему о multiple dispatching

Дело в том, что семантика присваивания полиморфна по отношению к двум видам объектов:
что присваивается

чему присваивается

Возможны тут 4 случая

Тип источникаТип приёмникаСемантика операцииBaseBaseНормальное присваивание объекта класса BaseBaseDerivedНедопустимая операция, так как часть членов класса Derived не будет присвоенаDerivedBaseУсечение Derived до Base, опасная, но допустимая в С++ операция, поскольку часть данных теряетсяDerivedDerivedНормальное присваивание объекта класса Derived

Именно поэтому operator= как бы не наследуется и не переопределяется.
Поэтому я бы рассматривал этот конкретный пример совершенно отдельно от обсуждения виртуальных функций, которые достаточно просты по
своей семантике.



автор2. Как часто вы используете виртуальные функции в своих программах и как лично вы относитесь к данному механизму?

Ну, как часто, так часто, как надо. Это зависит от задачи. В общем, полиморфизм на типе объекта используется везде, где используются иерархии классов и операции над этими классами.
С точки зрения семантики виртуальных функций в С++, она, безусловно, контринтуитивна, потому что естественным для программиста было бы, если бы все методы были автоматом виртуальными. Появление в С++ необходимости явно требовать
оформления вызова виртуальной функции как косвенного вызова через таблицу виртуальных методов безусловно связана
с необходимостью обеспечить управление быстродействием результирующей программы, получаемой из исходного кода.
И хотя в общем стоимость виртуального вызова не так уж и сильно больше стоимости вызова обычного (оба на самом деле
достаточно высоки, потому что надо формировать аргументы и переключать стек), во времена появления С++, наверное,
разработчики боялись всего-всего, и я полагаю, что Страустрап просто остерёгся делать все поголовно функции виртуальными.

В более современных языках, которые являются наследниками С++, -- Java и C# -- виртуальные вызовы делаются автоматически
везде.

Кстати, не многие помнят, что слово virtual в английском языке означает "действительный", и именно поэтому это слово используется
в этом случае.

автор3. Считаете ли вы ослабление правил замещения для типа возвращаемого значения и для аргументов правильным решением? Интересно, если бы комитет не принял предложения об этом, каким образом были бы решены возможные проблемы(пример из теории компиляторов, метод clone в базовом и производных классах). Лично мне кажется, что это привело бы к изменениям в системе типов языка, что в конечном счете могло положительно сказаться на ней.

Я не очень понял, о чём ты тут ... Я бы думал, что кардинальное решение этой проблемы -- множественная диспетчеризация.
Другой вариант решения, очень простой -- это использовать вместо
Код: plaintext
1.
void X::copy(const X*src)


функцию
Код: plaintext
1.
X* X::clone() const



Тут семантика меняется, не смотря на то, что в принципе функция делает то же самое, и всё становится сильно легче, потому что полиморфизм идёт только по первому и единственному аргументу.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409139
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)SashaMercury,

Параллельное наследование насколько мне известно не реализовано ещё ни в одном языке к сожалению. Всё ложится на плечи программиста на уровне "я знаю что класс А всё таки класс Б"

Скорее всего, ты и имеешь в виду множественную диспетчеризацию, а не "параллельное наследование".
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409418
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivkealon(Ruslan)SashaMercury,

Параллельное наследование насколько мне известно не реализовано ещё ни в одном языке к сожалению. Всё ложится на плечи программиста на уровне "я знаю что класс А всё таки класс Б"

Скорее всего, ты и имеешь в виду множественную диспетчеризацию, а не "параллельное наследование".
нет, именно то, что SashaMercury заметил

в С++ оно не особо критично, так как виртуальнных конструкторов всё равно нема
архитектурно проблема появляется, например, так:
есть контейнер определённых объектов (можно для усложения к этим объектам добавить ссылку на контейнер)

у этого контейнера да и у объектов есть виртуальные методы

в потомке этого контейнера нужно: расширить дочерние объекты новой функциональностью
довольно часто нужно обращаться к новым методам контейнера из объекта и наоборот, а описания у нас имеют базовые типы - пришли к проблеме постоянно каста
kealon(Ruslan)"я знаю что класс А всё таки класс Б"
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409423
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivнет, это не так. можно программировать вообще без виртуальных функций, на шаблонном полиморфизме, на современном С++ еще на лямбдах, и чем новее версия языка, тем более он нас к этому стимулирует.
Ну и гвозди можно микроскопом забивать, но молотком удобнее. А интерфейсы реализовывать удобнее всего с помощью виртуальных функций.
MasterZivВиртуальные функции нужны только когда у вас в программе есть иерархии классов.
Иерархии (помимо реализации интерфейсов) в правильно спроектированной программе не нужны.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409436
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZivнет, это не так. можно программировать вообще без виртуальных функций, на шаблонном полиморфизме, на современном С++ еще на лямбдах, и чем новее версия языка, тем более он нас к этому стимулирует.
Ну и гвозди можно микроскопом забивать, но молотком удобнее. А интерфейсы реализовывать удобнее всего с помощью виртуальных функций.
MasterZivВиртуальные функции нужны только когда у вас в программе есть иерархии классов.
Иерархии (помимо реализации интерфейсов) в правильно спроектированной программе не нужны.
Это заявление эквивалентно тому, что Duck Typing - необходимая и достаточная на все случаи жизни.

Не согласен, инкапсуляция данных тоже важна.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409447
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)MasterZivпропущено...


Скорее всего, ты и имеешь в виду множественную диспетчеризацию, а не "параллельное наследование".
нет, именно то, что SashaMercury заметил

в С++ оно не особо критично, так как виртуальнных конструкторов всё равно нема
архитектурно проблема появляется, например, так:
есть контейнер определённых объектов (можно для усложения к этим объектам добавить ссылку на контейнер)

у этого контейнера да и у объектов есть виртуальные методы

в потомке этого контейнера нужно: расширить дочерние объекты новой функциональностью
довольно часто нужно обращаться к новым методам контейнера из объекта и наоборот, а описания у нас имеют базовые типы - пришли к проблеме постоянно каста
kealon(Ruslan)"я знаю что класс А всё таки класс Б"


нафига тебе контейнер с полиморфными методами?

ну да, иногда нужно что-то настраивать в алгоритмах, но виртуальные методы - не единственный способ это сделать.
C++ - не Ява, тем он и хорош, что можно делать по-разному.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409469
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivнафига тебе контейнер с полиморфными методами?

ну да, иногда нужно что-то настраивать в алгоритмах, но виртуальные методы - не единственный способ это сделать.
C++ - не Ява, тем он и хорош, что можно делать по-разному.
да как бы обычные практические задачи, вполне конечно можно обходить с помощью генериков или метапрограммирования

но в данном случае это явная недоработка, которая мешает компонентному использованию
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409743
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)MasterZivнафига тебе контейнер с полиморфными методами?

ну да, иногда нужно что-то настраивать в алгоритмах, но виртуальные методы - не единственный способ это сделать.
C++ - не Ява, тем он и хорош, что можно делать по-разному.
да как бы обычные практические задачи, вполне конечно можно обходить с помощью генериков или метапрограммирования

но в данном случае это явная недоработка, которая мешает компонентному использованию


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

0. Модель размещения производного объекта в памяти на 1982 год (думаю, что и сейчас не сильно изменилась) заключалась в объединении его собственных членов и членов базового класса.
Anatoly MoskovskySashaMercury,

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

Вы, судя по всему, говорите об этом
Код: 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.
class A
{
public:
	void print();
};

void A::print()
{
	printf("A\n");
}

class B:public A
{
public:
	void print();
};

void B::print()
{
	printf("B\n");
}

int main()
{
	A a;
	a.print();//A
	B b;
	b.print();//B
	b.A::print();//A
}



Но это скорее агрегация. И если поведение выше кажется логичным, то какое адекватное поведение в 1982 Bjarne мог ожидать от такого?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class A
{
public:
	void print();
};

void A::print()
{
	printf("A\n");
}

class B:public A
{
};


int main()
{
	A a;
	a.print();
	B b;
	b.print();
}



И это выглядит так, будто агрегация и наследование перемешаны. Потому, и не только потому, но и в целом, почему BS не сделал все методы виртуальными по умолчанию? Если метод будет переопределен в производном классе, то именно это определение фактически будет использовать для объектов данного класса. В том случае, когда не существует возможность представить реализацию конкретного метода в базовом классе, можно, например, использовать инструкцию аналогичную для чисто виртуальных функций. Если можно, приведите пожалуйста пример, где реализация виртуальных функций в таком формате была бы плохим решением. Наверняка тут есть подводные камни
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409956
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И странно, что абстрактные классы не появились сразу, к выходу Cfront 1.0 в 1985. Ведь BS приводит такой пример в 1982, где очевидно, что они нужны (в качестве базового используется класс Shape, виртуальные методы draw(), rotate())
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39409960
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпочему BS не сделал все методы виртуальными по умолчанию?

Производительность. Вызов виртуального метода это как минимум два лишних обращения к
случайному участку памяти. Кэши процессора не резиновые, а тогда их вообще не было.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410112
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryпочему BS не сделал все методы виртуальными по умолчанию?

Производительность. Вызов виртуального метода это как минимум два лишних обращения к
случайному участку памяти. Кэши процессора не резиновые, а тогда их вообще не было.


Почему ДВА и почему к СЛУЧАЙНОМУ?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410113
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПочему ДВА
В случае вызова виртуальной функции: чтение указателя vtable (RAM) ->чтение адреса функции (RAM)->выполнение маш. команды call
Вызов обычной функции: выполнение маш. команды call без чтения RAM (адрес функции - внутри команды)
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410119
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Указатель vtable лежит с данными объекта. Так что на кэш не повлияет, если объект нетривиальный, т.е. работает со своими мемберсами.
Так что лишней можно считать одну операцию.

Не стоит также забывать, что оптимизатор может производить невиртуальный вызов виртуальных ф-ций.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410252
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglТак что лишней можно считать одну операцию.
Считать можно что угодно, но операций там две )))
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410261
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСчитать можно что угодно, но операций там две )))
"лишняя" - одна
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410269
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил"лишняя" - одна
Anatoly MoskovskyВ случае вызова виртуальной функции: чтение указателя vtable (RAM) ->чтение адреса функции (RAM)->выполнение маш. команды call
Вызов обычной функции: выполнение маш. команды call без чтения RAM (адрес функции - внутри команды)
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410550
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЛично я бы ожидал, что ошибка компиляции возникнет ещё раньше, когда идёт переопределение
метода с другой сигнатурой.по идее, explicit решает эту проблему
MasterZivКстати, я видел в сети предложение в стандарт для реализации в С++ множественной диспетчеризации в виртуальных методах, вот это была бы бомба!А можно подробнее описать, что это?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410565
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbDimitry SibiryakovЛично я бы ожидал, что ошибка компиляции возникнет ещё раньше, когда идёт переопределение
метода с другой сигнатурой.по идее, explicit решает эту проблему
MasterZivКстати, я видел в сети предложение в стандарт для реализации в С++ множественной диспетчеризации в виртуальных методах, вот это была бы бомба!А можно подробнее описать, что это?


Выбор реализации метода по типу не только первого аргумента метода (this), но и всех остальных тоже.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410566
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivи часто ты наследуешься от контейнеров и что-то там переопределяешь?
как гуи займёшься так почти стабильно нужно
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410581
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)MasterZivи часто ты наследуешься от контейнеров и что-то там переопределяешь?
как гуи займёшься так почти стабильно нужно

расскажи нам об этом (желательно в отдельном топике)
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39410592
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВыбор реализации метода по типу не только первого аргумента метода (this), но и всех остальных тоже.Интересная идея.
А насколько часто нужен такой функционал? Т.е. когда типы параметров явно отличаются, мы делаем перегрузку функций, то тут всё ок. Остаются случаи, когда типы параметров находятся в иерархии классов. Но тут мы тоже можем явно написать функцию для каждого случая. В любом случае нам придётся писать такую функцию. Поэтому не совсем понятно, какая реализация диспетчеризации планировалась? В случае с this ответственность лежит на классе this, а что будет в случае остальных параметров?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39412855
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryпочему BS не сделал все методы виртуальными по умолчанию?

Производительность. Вызов виртуального метода это как минимум два лишних обращения к
случайному участку памяти. Кэши процессора не резиновые, а тогда их вообще не было.

Это единственная причина, или есть что-то ещё?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39413497
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbMasterZivВыбор реализации метода по типу не только первого аргумента метода (this), но и всех остальных тоже.Интересная идея.
А насколько часто нужен такой функционал? Т.е. когда типы параметров явно отличаются, мы делаем перегрузку функций, то тут всё ок.

что значит "часто нужен"?
это фундаментальное свойство объектной системы языка программирования. Если оно есть или его нет - это две большие разницы.

Остаются случаи, когда типы параметров находятся в иерархии классов. ?
Но тут мы тоже можем явно написать функцию для каждого случая.

ты не сможешь написать тут функцию.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39413580
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivты не сможешь написать тут функцию.тогда я, наверно, не совсем понял суть требуемой доработки.
Можно какой-нибудь пример для демонстрации?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39414224
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbMasterZivты не сможешь написать тут функцию.тогда я, наверно, не совсем понял суть требуемой доработки.
Можно какой-нибудь пример для демонстрации?

как ни странно, в Википедии есть довольно вменяемая статья на эту тему:
https://en.m.wikipedia.org/wiki/Multiple_dispatch?wprov=sfla1

Там описано даже предложение для C++.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39414457
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, как по мне, так слегка сомнительная концепция: один класс принимает решение о выборе метода на основе виртуальной таблицы объекта другого класса.
И таки это можно реализовать, вызывая внутри метода класса методы объектов и выполняя нужный функционал там. Будет выглядеть запутанно, да, но реализовать можно. Второй вариант: определение типа параметров перед вызовом метода + перегрузка(там же в вики пример на с++).
Ну и всё-таки я не могу придумать, где оно может понадобиться.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39414746
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbНу и всё-таки я не могу придумать, где оно может понадобиться.
В динамических языках перегрузку можно реализовать только мультидиспетчем.
Нафиг это в С++ - это большой вопрос ))
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39414929
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbMasterZiv, как по мне, так слегка сомнительная концепция: один класс принимает решение о выборе метода на основе виртуальной таблицы объекта другого класса.


Кто тебе сказал, что это делает ОДИН КЛАСС ?

CEMbИ таки это можно реализовать, вызывая внутри метода класса методы объектов и выполняя нужный функционал там. Будет выглядеть запутанно, да, но реализовать можно. Второй вариант: определение типа параметров перед вызовом метода + перегрузка(там же в вики пример на с++).
Ну и всё-таки я не могу придумать, где оно может понадобиться.

Там же дан пример о столкновении двух объектов при моделировании...
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39415132
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКто тебе сказал, что это делает ОДИН КЛАСС ?В коде одного класса.MasterZivТам же дан пример о столкновении двух объектов при моделировании...пример не показательный, так как столкновение нормально делается по-другому(собственно, оно там и так сделано по-другому, но как эмуляция реализации идеи), и там множественная диспетчеризация не требуется.

Давайте ещё раз. Простой пример: есть класс X, с методом, принимающим параметр класса А. Класс А является корнем иерархии классов. Идея MD: мы пишем X::m(A a), X::m(B a), X::m(C a),... и внутри пишем реализацию на каждый класс иерархии. При выполнении рантайм понимает, что у нас за объект и вызывает соответствующий метод. Сейчас будет вызван метод X::m(A) всегда.

В примерах реализация делается за счёт определения класса через dynamic_cast внутри метода X::m.

У меня есть 2 замечания к самой идее: 1. Реализация класса X зависит от иерархии классов A. Это неправильно: в случае добавления класса в иерархию, возможно нужно будет править код в X, добавлять ещё один метод m.
К слову сказать, у меня есть работающий код "столкновения" двух объектов, в котором параметры столкновения передаются методу обработки классу самого объекта. Это "один" метод на все типы объектов, т.е. тут стандартная диспетчеризация
2. Класс X принимает решение об обработке в методе m на основе класса входящего параметра. Это допускается, но сомнительно.

Ну и, всё ещё не могу придумать пример.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39415767
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,


Так и классы можно писать по-другому, на C, и никакой C++ не нужен...
А можно классы на ассемблерная писать, никакой C не нужен...
А можно еще данные самому в файл писать, никакая СУБД не нужна...
А зачем вообще компьютер, он же дорогой такой... Лучше на счетах считать!
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39415768
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb[

У меня есть 2 замечания к самой идее: 1. Реализация класса X зависит от иерархии классов A. Это неправильно: в случае добавления класса в иерархию, возможно нужно будет править код в X, добавлять ещё один метод m.

2. Класс X принимает решение об обработке в методе m на основе класса входящего параметра. Это допускается, но сомнительно.

.

еще раз, с чего ты взял, что то, какой метод будет вызван - это реализация класса X, а не языка C++ ?

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


вот это - дельное замечание...
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39415982
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА зачем вообще компьютер, он же дорогой такой... Лучше на счетах считать!Всё упирается в востребованность. Компьютеры востребованы, счёты - нет. И есть куча примеров, где компьютеры справляются лучше, чем счёты. Но всё ещё нету примеров, где MD справляется лучше, чем то, что есть сейчас. Где примеры?
MasterZivеще раз, с чего ты взял, что то, какой метод будет вызван - это реализация класса X, а не языка C++ ?да, верно, это реализация С++. Но по первому замечанию я не согласен, т.е. это не в плане реализации MD, а в плане архитектуры приложения: в случае изменения иерархии классов А, нам (вероятно) надо менять код класса X. Когда мы работаем с объектами иерархии А через интерфейс, нам менять X не нужно.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39415994
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
еще раз, с чего ты взял, что то, какой метод будет вызван - это реализация класса X, а не языка C++ ?



Немного почитал статью про open multimethods.
Основная идея в том, что мультиметодом можно сделать только свободную функцию, не функцию класса. При этом все параметры, по которым будет идти диспетчеризация, помечаются ключевым словом virtual.

Поэтому все твои опасения напасны, это не будет реализацией какого-то класса.

Также там есть в самом начале примеры того, где OMM могла бы быть полезной, приводится пример системы кодирования изображения с подсистемой перекодирования изображения из одного формата в другой.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416008
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНемного почитал статью про open multimethods.там, оказывается, всё сложнее, чем я себе представлял.MasterZivПоэтому все твои опасения напасны, это не будет реализацией какого-то класса.да я не опасался, я просто думал, что если делать через метод, то архитектура будет не шибко иделальнойMasterZivТакже там есть в самом начале примеры того, где OMM могла бы быть полезной, приводится пример системы кодирования изображения с подсистемой перекодирования изображения из одного формата в другой.о, так под это подходят любые конверторы из чего-то во что-то. А так же какие-нибудь агрегаторы. Ну всё, можно делать!
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416075
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

... а также любой оператор присваивания...
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416102
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, а так же любой бинарный оператор...

ёпрст... как мы сейчас выживаем вообще без MD!?!
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416178
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbMasterZiv, а так же любой бинарный оператор...

ёпрст... как мы сейчас выживаем вообще без MD!?!

вот.
а между тем, это всего лишь рассказ про ту козу, для избавления от которой ее надо сначала завести.
Завели себе козу статической типизации с выдумыванием обрядов моления на нее, а теперь вопрос - как избавиться от той козы не методом ее продажи или съедения, а путем делания вида, что ее нет.

Достаточно ли не замечать козу, чтобы несовместимая с ней множественная диспетчеризация сама по себе появилась,
и тоже ту козу не заметила?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416522
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teo609" для рождения С++ из C with Сlasses"
20 лет назад я учился именно такому С++. Большинство фишек из 11,14, 17 версий уводят все дальше от этого базового уровня. Становясь более мощным, язык позволяет все более сложные концепции и приемы, это повышает требования к программистам, уменьшает их число, повышает порог вхождения, но от возможности выстрелить в ногу так и не избавляет полностью.
Мне кажется, что современный С++ можно рассматривать как ветку от базового, направленную в сторону расширения возможностей языка. И что есть потребность в языке, который был бы другой веткой от базового С++, в котором меньше было бы всяких возможностей в духе Алексндреску, но который был бы надежнее, но без реализации через виртуальную машину (как Java), с сохранением и производительности и возможностью работы с иерархиями классов.
Просто ООП себя исчерпало. В нём ковырялись 30 лет как в грязном пальце на ноге.
А всего-лишь родили сложное процедурное программирование с неявным this аргументом
и over 100500 правил с каким-то нагромождением рулов типа там правила поведения
protected и прочего говна типа конструкторы и деструкторы.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416550
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teo609С++. Большинство фишек из 11,14, 17 версий уводят все дальше от этого базового уровня. Становясь более мощным, язык позволяет все более сложные концепции и приемы, это повышает требования к программистам, уменьшает их число, повышает порог вхождения
При ближайшем рассмотрении, сложность концепций в большинстве случаев вызывается нежеланием старперов изучать что-либо новое )))
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416556
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyЗавели себе козу статической типизации с выдумыванием обрядов моления на неенет ничего плохого в статической типизации :) Почему все обязательно становятся адептами или той или иной типизации? С++ хорош тем, что можно выбрать и настроить в нужном месте кода нужную типизацию. Или ненужную. И всё равно это будет работать!maytonПросто ООП себя исчерпало.а какие есть альтернативы? Концептуальные? Причём, чтобы можно было решать те же задачи, что решались с помощью ООП. Чем заменить ООП?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416588
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbа какие есть альтернативы? Концептуальные? Причём, чтобы можно было решать те же задачи, что решались с помощью ООП. Чем заменить ООП?
Вы уже говорите с позиции замены всего-того что написано. А зачем заменять? Просто не надо так делать.
Реляционная алгебра (SQL/DDL) на 99.99% не использует ООП. И хотя базовые возможности ООП заложены
в какой-то там Ansi-200* SQL, его всё равно не используют ибо для бизнес-логики в слое DBMS на это
по большему насрать.

А в С++ большинство ООП-решений - это сплошное овер-проектирование.
ООП - фетиш. И персональный мозговой онанизм самого автора кода.
Просто ему (автору) нравится использовать ООП-паттернализм так-же как и Гоголевскому
Петрушке нравилось когда "буквы складываются в слова".

Выкосите большую половину ООП из вашего кода и ничего у вас не изменится.
Всё так-же будет работать.

Бизнесу по большему счету все равно что у вас под капотом. ООП или кортежи,
структуры, записи, сеты, data-rows.

Поэтому на вопрос "как сделать" у меня другой ответ - не делайте так.

Никогда не делайте.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416616
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВы уже говорите с позиции замены всего-того что написано. А зачем заменять? Просто не надо так делать.Нет, мне хотелось бы дополнить чем-то. Не надо заменять.
maytonА в С++ большинство ООП-решений - это сплошное овер-проектирование.
ООП - фетиш. И персональный мозговой онанизм самого автора кода.Ну это не всегда так. ООП это концепция, и в её рамках можно что-то делать. Конечно, как и везде, случается, что ООП ради ООП, но это же не повсеместно. Есть задачи, которые хорошо ложатся на ООП. И, всё правильно: поэтому не надо всё пытаться положить на ООП. Потому я и задал вопрос: какие есть альтернативы?
maytonВыкосите большую половину ООП из вашего кода и ничего у вас не изменится.
Всё так-же будет работать.ну это тоже не всегда так: организация данных и работы с ними всё-таки упрощает разработку. Конечно, всё, что написано на сяхх можно написать на сях, но времени надо будет больше, ошибок будет больше и так далее.
maytonПоэтому на вопрос "как сделать" у меня другой ответ - не делайте так.

Никогда не делайте.а что делать, если делать всё равно надо? :)
С++, тем временем, продолжает развиваться сам по себе, даже не касаемо ООП, что позволяет придумывать и реализовывать новые концепции. Наверно, позволяет, я не знаю. Ну, т.е. я их не вижу, я про них не знаю, может они уже есть, вот я про них и спрашиваю: есть ли они?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416647
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbНу это не всегда так. ООП это концепция, и в её рамках можно что-то делать. Конечно, как и везде, случается, что ООП ради ООП, но это же не повсеместно. Есть задачи, которые хорошо ложатся на ООП. И, всё правильно: поэтому не надо всё пытаться положить на ООП. Потому я и задал вопрос: какие есть альтернативы?
Мне пожалуй будет интересно говорить об альтернативах тогда, когда я увижу
какое-то value в написанном коде. Мне вообще интересны такие хештеги как
#алгоритмы, #базыданных, #структуры_данных, и интересные задачи и парадоксы.
А теперь вернёмся к тому что написал Саша в 1-м посте. О чём это? Какую задачу
это решает? Как много мы с вами, коллеги согласны потратить времени на разглядывание
очередного "грязного пальца" на ноге? Я в скобках даже скажу что не понимаю мотиваций к созданию
подобного рода топиков. Но поскольку Саша - мембер класса "любопытный" - то ему это
интересно и он спрашивает все что интересно. Далее вы говорите что есть класс
задач которые хорошо ложаться на ООП. Я согласен. Существуют. Но их не много.
А что насчет всех остальных задач то там ООП не нужно. И используйте ваш С++
без ООП. Благо в нём и так полно всяких "фич" облегчающих рутину.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416786
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ используйте ваш С++
без ООП.
ООП - это просто модульность, сделанная как надо.
Говорить что лучше писать программы без ООП все равно, что говорить что лучше всю программу в одном файле написать. Один файл это же намного проще нескольких )).
Ну да, написать можно. Прочесть и пофиксить нельзя
maytonВыкосите большую половину ООП из вашего кода и ничего у вас не изменится.
Всё так-же будет работать.
Я даже больше скажу. Если весь код заменить на машинный, то тоже все будет также работать. И опять же, все упростится. Никаких тебе деструкторов и прочих гиперсложных концепций.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416890
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbboobyЗавели себе козу статической типизации с выдумыванием обрядов моления на неенет ничего плохого в статической типизации :)
...
Имхо, это перевернутое утверждение.
Можно даже хорошее найти или придумать.
(Найти - исключение ошибок-описок технического сорта,
придумать - якобы "упрощается" управление проектами со сложной структурой).
Плоха не статическая типизация сама по себе, а заявления о том, что другой типизации для вас в нашем языке не будет.
Имхо, основано это на представлениях создателей языка о тех людях, которые будут этот язык использовать и списке целей, которые они себе ставят при создании языка.
И у разработчиков С++ наилучшие, идеально благоприятные для прикладного программиста
представления о нем, программисте, как о существе разумном, в целом представляющим неплохо, что он собирается сделать и почему именно так.

Но, так как в списке целей - главная и единственная существенная - написать такой компилятор, который будет создавать итоговый код, заведомо лучшего, с точки зрения создателя, качества, чем это сможет сделать любой силы прикладной программист,
то результат сопоставим с результатом прочих создавальщиков языков со статической типизацией.
Мы, создавальщики таких языков, существуем не для того, чтобы вы на нем программы
писали, а чтобы наш компилятор был всегда лучше вас - живых недоумков, клацающих клавишами.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416898
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

ОМГ, а ты вообще как понимаешь, зачем нужна статическая типизация?
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416942
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,

Вы слишком многого хотите от человека который пишет такое
boobyразность двух нечетных чисел всегда есть нечетное число.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416945
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglbooby,

ОМГ, а ты вообще как понимаешь, зачем нужна статическая типизация?
мой предыдущий пост как бы намекает, главным образом - 100% за тем же, за чем нужно
структурное программирование - для создания предмета гордости разработчику компилятора.
Все остальные цели вторичны.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39416977
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySiemargl,

Вы слишком многого хотите от человека который пишет такое
boobyразность двух нечетных чисел всегда есть нечетное число.Т.е мало того, что не нашел профильный форум по всяким яваскриптам, так и еще полагает, что один человек способен писать только на одном языке =)

Бедняга. Но весна же, март, пятница, кризис. Понять и простить.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417012
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyструктурное программирование - для создания предмета гордости разработчику компилятора.мягкое и тёплое перепутал, да ладно
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417072
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl...
Т.е мало того, что не нашел профильный форум по всяким яваскриптам...

:))
в отличие от марта и пятницы это не бьющееся и не проходящее.

Ладно, развлекайтесь без меня, раз не хотите, чтобы я вас развлекал.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417074
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилboobyструктурное программирование - для создания предмета гордости разработчику компилятора.мягкое и тёплое перепутал, да ладно
И что?
То есть можно привести какую-то другую вменяемую формулировку причины того, что у программы должен быть один вход и один выход?
Хоть сегодня и пятница, а я даже готов запастись любопытством по этому поводу.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417105
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

какое отношение имеет структурное программирование к разработке компиляторов?
к созданию ЯП - имеет.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417107
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyЛадно, развлекайтесь без меня, раз не хотите, чтобы я вас развлекал.до Ксеноцефала тебе ещё далеко, треннируйся
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417135
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилbooby,

какое отношение имеет структурное программирование к разработке компиляторов?
к созданию ЯП - имеет.
Вот так так. Вот они какие - теплое и мягкое, оказывается.

Изобретатель ЯП, заставляющий свой ЯП приседать под структурное программирование,
не думает о программисте (то есть, если и думает, то обязательно плохо),
он думает о создании такого языка, компиляция текста которого генерирует программы гарантированно
(с его точки зрения) лучшего качества, чем сможет догадаться .
И этому использующий ЯП прикладной программист обязан не мешать - не мешать компилятору компилировать, генерируя из любых текстов плохого прикладного программиста хорошие программы.
Здесь сначала думают о том, что и как должен делать компилятор, причем в этих историях - обязательно оптимизирующий,
а потом - какие возможности не включать в язык. "Структурное программирование" - это не способ программирования,
а набор гарантий для оптимизирующего компилятора об области переламывания кода прикладного программиста на вкус оптимизирующего компилятора.

Единственный способ заставить прикладника не мешать компилировать - исключить из языка возможности, препятствующие компилятору коверкать код прикладного программиста.
Само идея структурного программирования, в отрыве от мечты создания "идеального" компилятора, имхо,
вообще не имеет почвы для возникновения.

Все эти шпагоглататели, вилкопоедатели и создатели ЯП с оптимизирующими компиляторами - они все с богом соревнуются,
стоя как зевсы, кто рожая компиляторы к языкам с запрещенным goto прямо из мозга, а кто засовывая вилки и шпаги прямо в мозг.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417212
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

структурное с объектно-ориентированным спутал?

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

вроде 2017 год за окном, а не 1957
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417216
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, тут все банально просто: делаешь структурно, все в одном экземпляре, а завтра становится надо в двух! И ... приплыли :(

Классы это как минимум область видимости переменных, я их так в основном и использую. Хочешь два объекта создай, хочешь четыре.

Более сложные извраты ООП типа наследования тут вообще не нужны. ИМХО есть три языка: С, С с классами и С++. Я второго придерживаюсь.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417243
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилbooby,

структурное с объектно-ориентированным спутал?

продолжай пытаться развлекать публику
как-то вяло ты комментируешь, совсем без ентузазизьма.
да еще и тухлое "объектно-орентированное" программирование приплел на сон грядущий.

А что до 2017 года по сравнению 1975 - это да, в 2017 моднее было бы модель памяти
обсуждать, а не структурное программирование.
Но даже начинать бессмысленно - и так ясно, что ты скажешь по этому поводу.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417265
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
не очень понятно, что именно вы пытаетесь доказать..

maytonПросто ООП себя исчерпало. В нём ковырялись 30 лет как в грязном пальце на ноге.
А всего-лишь родили сложное процедурное программирование с неявным this аргументом
и over 100500 правил с каким-то нагромождением рулов типа там правила поведения
protected и прочего говна типа конструкторы и деструкторы.

Марк, что за ненависть к ООП?) И почему конструкторы стали "говном"?

maytonА теперь вернёмся к тому что написал Саша в 1-м посте. О чём это? Какую задачу
это решает? Как много мы с вами, коллеги согласны потратить времени на разглядывание
очередного "грязного пальца" на ноге? Я в скобках даже скажу что не понимаю мотиваций к созданию
подобного рода топиков. Но поскольку Саша - мембер класса "любопытный" - то ему это
интересно и он спрашивает все что интересно. Далее вы говорите что есть класс
задач которые хорошо ложаться на ООП. Я согласен. Существуют. Но их не много.
А что насчет всех остальных задач то там ООП не нужно. И используйте ваш С++
без ООП. Благо в нём и так полно всяких "фич" облегчающих рутину.

Мы вроде-бы не офисный планктон, чтобы разглядывать пустые листы А4с 8 до 17, потому иногда можно посмотреть и на пальцы, пусть и грязные. Хотя я лично не считаю, что тему виртуальных функций можно с этим сравнить. Более того, топики закрываются также быстро, как и открываются, когда-то закрыли шикарную задачу над которой я думал несколько дней 11111011111.c, после этого на закрытие топа о виртуальных функциях я точно не обижусь) Я спать, на выходных постараюсь закончить по существу
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417271
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobySiemarglbooby,

ОМГ, а ты вообще как понимаешь, зачем нужна статическая типизация?
мой предыдущий пост как бы намекает, главным образом - 100% за тем же, за чем нужно
структурное программирование - для создания предмета гордости разработчику компилятора.
Все остальные цели вторичны.


Ну, ты неправ.
Не, не так.

"Booby, ты неправ!"
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417272
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobySiemargl...
Т.е мало того, что не нашел профильный форум по всяким яваскриптам...

:))
в отличие от марта и пятницы это не бьющееся и не проходящее.

Ладно, развлекайтесь без меня, раз не хотите, чтобы я вас развлекал.

Мы хотим, чтобы ты нас развлекал, и чтобы мы тебя. И вообще.

Ну как бы ты неправ, потому что в C++ не только статическая типизация есть.

т. е. типизация всегда статическая , но то, что ты отчасти подразумеваешь под этим словом, есть и другого вида, например, почти "утиная" типизация как в, скажем, Питоне, на шаблона.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417273
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилbooby,

структурное с объектно-ориентированным спутал?

продолжай пытаться развлекать публику


так, давайте пожалуйста мне тут оппонентов не грубить!

каждый имеет право на мнение, в свободной стране живем, и т. д.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417338
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, у меня нет ненависти к ООП. У меня есть бесконечное изумление.
ООП - это всего лишь технический приём. Фича. Коих в современном ЯП более
сотни. Но мы с упорством почитателей карго-культа из раза в раз поднимем
один и тот-же топик. Неужели нельзя почитать спеку? Сдедать макет. Runn-ить
1 раз и сделать вывод. Дада. Я плюсую даже за последний кейс. И я-бы так
поступил. И это правильно. Программирование это инженерное исскусство.

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

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

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

Это знаете-ли как в университете на курсе матана внезапно обратиться к профессуре
с вопросом о решении квадратных уравнений. Это пошло. И стыдно.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417342
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМы вроде-бы не офисный планктон, чтобы разглядывать пустые листы А4с 8 до 17, потому иногда можно посмотреть и на пальцы, пусть и грязные. Хотя я лично не считаю, что тему виртуальных функций можно с этим сравнить. Более того, топики закрываются также быстро, как и открываются , когда-то закрыли шикарную задачу над которой я думал несколько дней 11111011111.c, после этого на закрытие топа о виртуальных функциях я точно не обижусь) Я спать, на выходных постараюсь закончить по существу
Что за топик? Если мы его закрыли то видимо на то были основания.
Подними ее снова но в нужном подфоруме и с нужной фомулировкой.

Подчеркнутое я считаю как-бы брошенным упреком. Дескыть здесь (в sql.ru)
что-то неправильно модерируют и кого-то избирательно обижают.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39417482
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivС точки зрения семантики виртуальных функций в С++, она, безусловно, контринтуитивна, потому что естественным для программиста было бы, если бы все методы были автоматом виртуальными. Появление в С++ необходимости явно требовать
оформления вызова виртуальной функции как косвенного вызова через таблицу виртуальных методов безусловно связана
с необходимостью обеспечить управление быстродействием результирующей программы, получаемой из исходного кода.
И хотя в общем стоимость виртуального вызова не так уж и сильно больше стоимости вызова обычного (оба на самом деле
достаточно высоки, потому что надо формировать аргументы и переключать стек), во времена появления С++, наверное,
разработчики боялись всего-всего, и я полагаю, что Страустрап просто остерёгся делать все поголовно функции виртуальными.

В более современных языках, которые являются наследниками С++, -- Java и C# -- виртуальные вызовы делаются автоматически
везде.



Не знаю как я сразу не прочитал. BS действительно упоминает о том, насколько настороженно общественность отнеслась к виртуальным функциям. Спасибо!
...
Рейтинг: 0 / 0
К виртуальным функциям
    #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
К виртуальным функциям
    #39418803
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglЭлементарно
Код: plaintext
1.
2.
3.
4.
5.
void myfunc(Base *pb)
{
   Derived *px = dynamic_cast<Derived*>(pb);
....
}


Ну, и какой инфы компилятору не хватает чтобы сгенерировать код для всех пар base-derived? ))
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418850
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

реальная пара будет известна только в рантайме
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418886
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglреальная пара будет известна только в рантайме
Да, как только становится известно значение указателя vtable - сразу понятно какая пара. Никакой дополнительной инфы хранить не надо.
Там тупо простейший switch:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
switch(ptr->vptr) {
case &Derived::vtable: 
  ptr2 = cast<Base, Derived>(ptr);
  break;
default:
  throw bad_cast();
}


Если какие-то компиляторы этот switch, состоящий в большинстве случаев из пары условных переходов и вызовов пустых инлайн функций, реализуют как какие-то лукапы в каких-то таблицах связанных с RTTI - это проблема этих компиляторов.
Говорить, что это все должно быть в RTTI - нонсенс
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39418973
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAnatoly Moskovsky,

реальная пара будет известна только в рантайме

почему пара?
Base вообще фиксирован, если это не шаблонная функция.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39419033
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

У тебя так все просто. А файл rtti.c из сорцов gcc имеет худо бедно 1600 строк.
...
Рейтинг: 0 / 0
К виртуальным функциям
    #39419283
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglУ тебя так все просто. А файл rtti.c из сорцов gcc имеет худо бедно 1600 строк.
Так я не говорю, что нельзя сделать сложно. Я говорю что мы не обязаны это делать ))
...
Рейтинг: 0 / 0
106 сообщений из 106, показаны все 5 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / К виртуальным функциям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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