Daniro_San
@Daniro_San
Программист

Что не так со словом virtual?

Я в курсе, что virtual не обязательное ключевое слово и не должно влиять на переопределение.
Но!

С этим кодом все в порядке:

struct A
{
    /// Слово virtual отсутствует
    std::string Get ()
    {
        return "AB";
    }
};

struct B : public A
{
    /// Переопределяем метод Get
    std::string Get()
    {
        /// Приводим this к A* и вызываем Get, удаляя первый символ
        return ( ( A* ) this ) -> Get () .erase (0, 1); 
    }
};

///...
std :: cout <<B().Get(); /// Все нормально, выводится 'B'


А с вот этим нет:

struct A
{
    /// Слово virtual присутствует
    virtual std::string Get ()
    {
        return "AB";
    }
};

struct B : public A
{
    /// Переопределяем метод Get
    std::string Get()
    {
        /// Приводим this к A* и вызываем Get, удаляя первый символ
        return ( ( A* ) this ) -> Get () .erase (0, 1); 
    }
};

///...
std :: cout <<B().Get(); /// main сразу завершается с возвратом что то около -14556645665566
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
std::string Get()
    {
        /// Приводим this к A* и вызываем Get, удаляя первый символ
        return ( ( A* ) this ) -> Get () .erase (0, 1); 
    }

Получил бесконечную рекурсию, потому что ((A*)this)->Get() -- полиморфный вызов, потому что Get в классе A определён как virtual. Т.е. ты возьмёшь из таблицы виртуальных функций подобъекта A указатель на виртуальную функцию Get, а он указывает на B::Get.
Если хочешь вызвать метод класса А -- так и пиши:
struct B : public A
{
    /// Переопределяем метод Get
    std::string Get()
    {
        return A::Get () .erase (0, 1); 
    }
};
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы