Const изменяя значения переменных

У меня есть виртуальный метод get, который выглядит так в суперклассе:

virtual double getPortagem() const;
double via_Ligacao::getPortagem() const
{
return 0;
}

И в их «детстве»

double getPortagem();
double auto_Estrada::getPortagem()
{
return portagem;
}

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

0

Решение

Переопределение функции не выполняется, поскольку вы создаете новую функцию в дочерних классах, объявляя неконстантную функцию, которая не получает никакого соответствия с функцией в суперклассе.

1

Другие решения

В C ++ 11 вы можете использовать ключевое слово override чтобы убедиться, что предполагаемое переопределение действительно является переопределением:

double auto_Estrada::getPortagem() override
{
return portagem;
}

Тогда вы получите ошибку компиляции, если она не переопределение, которое это неconst функция не (так как она отличается const-несение из одноименного метода базового класса).

Вместо переопределение функция базового класса этой функции тени функция базового класса, так что если вы вызываете o.getPortagem() где o является const и класса auto_Estradaкомпилятор не найдет базовый класс const функционировать и жаловаться.

В C ++ 03 самое лучшее, что вы могли сделать, — это статически утверждать, что одна и та же именованная функция базового класса может вызываться с одинаковыми аргументами (это помогло, но не было гарантировано). Обратите внимание, что в C ++ 03 не было static_assert, Обычный способ сделать статические утверждения C ++ 03 был через typedef массива, с отрицательным размером, где вы хотели ошибку времени компиляции.


Что касается терминологии,

то, что вы называете «дочерним классом», является производный класс (Терминология C ++) или подкласс (более общая терминология информатики, я полагаю, родом из Smalltalk),

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

Формально неопределенное поведение — использовать неопределенное значение, поэтому может случиться что угодно.

1

По вопросам рекламы [email protected]