LINUX.ORG.RU

Переопределение возвращаемого значения виртуального метода в C++

 , ,


0

1

Доброго времени суток, ЛОР. Имеется такой код:

class mybad : public std::exception
{
private:
    std::string s = "Fuck!!!";
public:
    virtual const char* what() const noexcept
    {
        return s.c_str();
    }

};

Это учебный пример, скажем так. Как мне написать, чтобы переопределить метод what(), чтобы он возвращал std::string ?

P.S. Причина исправления - сдуру написал, что возвращаемое значение входит в сигнатуру функции в C++

★★

Последнее исправление: zamazan4ik (всего исправлений: 1)

Ты не можешь переопределить метод методом с отличающейся сигнатурой.

Зато ты можешь сделать два метода what() с разными типами возвращаемых значений. Перегрузка по возвращаемому значению.

Y ★★
()
Последнее исправление: Y (всего исправлений: 2)

§10.3/5

The return type of an overriding function shall be either identical to the return type of the overridden function or covariant with the classes of the functions. If a function D::f overrides a function B::f, the return type of the functions are covariant if the satisfy the following criteria:

  • both are pointers to classes or references to classes;
  • the class in the return type of B::f is the same class as the class in the return type of D::f or, is an unambiguous direct or indirect base class of the class in the return type of D::f and is accessible in D;
  • both pointers or references have the same cv-qualification and the class type in the return type of D::f has the same cv-qualification as or less cv-qualification than the class type in the return type of B::f.
mix_mix ★★★★★
()

в С++ возврат вроде как не входил в сигнатуры

пусть ынтерпрайз здохнет с таких решений: верни экземпляр класса-прослойки который умеет кастоваться к «const char *» и «std::string» и ещё к чему там нужно будет..

MKuznetsov ★★★★★
()
Ответ на: комментарий от Y

Перегрузка по возвращаемому значению.

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

anonymous
()
Ответ на: комментарий от pon4ik

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

zamazan4ik ★★
() автор топика
Ответ на: комментарий от zamazan4ik

Это путь вникуда :)

Вся эта область - прикладная.

pon4ik ★★★★★
()

если очень захотеть, можно в космос полететь

template <typename T> T what(T *dummy = 0) {}
anonymous
()
Ответ на: комментарий от zamazan4ik

Как уже сказали, с абстрактными «захотелось» тебе в другое место. Нет задачи - не о чем говорить.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)

Тащемта никак. Но зачем тебе нужен const char *? Возвращай ты const std::string& и в вызывающем коде дёргай c_str(), если уж нужна сишная строка.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

Но зачем тебе нужен const char *? Возвращай ты const std::string&

Вообще-то, он так и хочет, но в std::exception метод what возвращает char*.

DarkEld3r ★★★★★
()
    virtual const char* what() const noexcept
    {
        return s.c_str();
    }
    
    virtual std::string wtf() const noexcept
    {
        return s;
    }

Как-то примерно так

asaw ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.