Перегрузка оператора приведения типа

232
17 апреля 2017, 05:46

Мне необходимо при приобразовании указателя на объект класса А в указатель на объект класса B выдавать exception,но компилятор не позволяет перегрузку

 #include <iostream>
    using namespace std;
    class A
    {
        protected:
            int a;
        public:
            A operator B*()(A *ax) //Тут выдает ошибку,говорит,что B не имя типа
            {
                throw("Bad Type Overload");
            }
    };
    class B:public A
    {
     protected:
        int B;
    };
    int main()
    {
        A *a;
        B *b;
        b=(B*)a;
        return 0;
    }
Answer 1

Начнем с того, что что такое B, в строке с оператором неизвестно.

Далее, оператор приведения не имеет возвращаемого типа (он уже указан в операторе!), и не получает никакого параметра - он уже получает this...

Член int B; в классе B тоже не есть хорошо.

Приведение b=(B*)a не будет даже пытаться использовать ваш оператор - потому что это приведение указателя к указателю (в скобках - ужасное: указателя на базовый класс к указателю на производный...)

Так что лучшее, что вы можете получить - примерно

class B;
class A
{
    protected:
        int a;
    public:
        operator B*()
        {
            throw("Bad Type Overload");
        }
};
class B:public A
{
 protected:
    int b;
};
int main()
{
    A *a;
    (B*)*a;
    return 0;
}

но это все - не очень здоровое занятие, и непонятно кому и зачем нужное...

Update
Вот, взгляните - исключение вы можете получить, но при приведении ссылок.

#include <iostream>
using namespace std;
class Base
{
public:
    virtual ~Base() {}
};
class Derived: public Base
{
public:
    virtual ~Derived() {}
};

int main()
{
    Base * b = new Base;
    Derived * d = dynamic_cast<Derived *>(b);
    cout << d << endl;
    try {
        Base bb;
        Derived & dd = dynamic_cast<Derived &>(bb);
    } catch(exception&e)
    {
        cout << e.what() << endl;
    }
}
READ ALSO
HTML audio.currentTime не меняется в Google Crome

HTML audio.currentTime не меняется в Google Crome

Доброго времени суток

314
скролл не там, где надо

скролл не там, где надо

Постараюсь описать детальноВ общем у меня на странице есть блок со скроллом Вот нарисовал схему:

241
Javascript. Наследование метода, изменение

Javascript. Наследование метода, изменение

Изучаю тонкости ООП в Javascript

208
как сравнить две даты в JavaScript с помощью moment.js?

как сравнить две даты в JavaScript с помощью moment.js?

Для упрощенной работы с временем я воспользовалсь библиотекой momentjs

279