Класс, основанный на ролях

Какой тип приведения происходит здесь (в B::get())?

class A {
public:
    A() : a(0) {}
    int a;
};

class B : public A {
public:
    A* get() {
        return this; //is this C-style cast?
    }
};

int main()
{
    B b;
    cout << b.get()->a << "\n";

    system("pause");
    return 0;
}

Я видел такой код в известном API. Лучше ли делать static_cast<A*>(this);?

Ответ 1

Это стандартное преобразование указателя на основе базы. Правила заключаются в том, что указатель на D с некоторыми квалификациями const/volatile может быть преобразован в указатель на B с теми же квалификаторами, если B является базовым классом D.

Стандартные преобразования - это неявные преобразования со встроенными значениями и являются отдельными понятиями для таких вещей, как static_cast или приведения в стиле C.

Как правило, лучше всего полагаться на неявные преобразования, когда сможете. Явные преобразования добавляют больше шума кода и могут скрывать некоторые ошибки обслуживания.

Ответ 2

Это неявное преобразование к предку. Неявные преобразования, как правило, безопасны, и они не могут делать вещи static_cast не могут. Они на самом деле еще более ограничены: вы можете сделать unchecked downcast с static_cast, но не с неявным преобразованием.