У меня есть виртуальный метод get, который выглядит так в суперклассе:
virtual double getPortagem() const;
double via_Ligacao::getPortagem() const
{
return 0;
}
И в их «детстве»
double getPortagem();
double auto_Estrada::getPortagem()
{
return portagem;
}
Меня беспокоит то, что если я объявлю дочерний метод неконстантным, результаты будут соответствовать вставленным значениям, но если я объявлю как константный метод, он вернет мне позицию в памяти. Не могли бы вы, ребята, объяснить мне это, пожалуйста?
Переопределение функции не выполняется, поскольку вы создаете новую функцию в дочерних классах, объявляя неконстантную функцию, которая не получает никакого соответствия с функцией в суперклассе.
В 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),
то, что вы называете «положением в памяти», представляется не произвольными битами в неинициализированной переменной, интерпретируемой как значение с плавающей запятой, которое называется неопределенное значение.
Формально неопределенное поведение — использовать неопределенное значение, поэтому может случиться что угодно.