static_cast ограничивает доступ к публичной функции-члену? - PullRequest
3 голосов
/ 18 декабря 2011

Я получаю сообщение об ошибке: «A» - недоступное основание «B» в static_cast следующего примера:

template<typename Derived>
class A {
protected:
    void funA() { static_cast<Derived *> (this)->funB(); }
};

class B: protected A<B> {
public:
    void funB() {}
    void funC() { funA(); }
};

int main() {
    B().funC();
    return 0;
}

Но он компилируется / работает хорошо, когда вместо этого используется reinterpret_cast или приведение типа C ((Derived *) this) -> funB (). Правильно ли это поведение?

Используется компилятор: gcc версия 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC).

Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Я получаю сообщение об ошибке: «A» является недоступным основанием «B» в static_cast следующего примера:

Ожидается: Bявляется производным от A<B>, но это наследование защищено: только B и его производные классы могут использовать факт B является производным от A<B>.

Но он компилируется / работает хорошопри использовании reinterpret_cast (...).Правильно ли это поведение?

Это ожидается: reinterpret_cast не заботится о наследовании или других отношениях между типами.

Если возможно, reinterpret_cast просто дает вам указатель сто же значение (указывающее на тот же байт), что и исходное значение указателя.

Это просто скрывает проблему.

Но оно компилируется / работает хорошопри использовании (...) C-style type cast ((Derived *)this)->funB() вместо этого.Правильно ли это поведение?

Ожидается: приведения в стиле C игнорируют контроль доступа. Это просто скрывает проблему.

Исправление состоит в том, чтобы сделать отношение наследования между A<B> и B доступным там, где вы хотите его использовать.

1 голос
/ 18 декабря 2011

Защищенное и частное наследование не создает - это отношение между классами, которое требуется для того, чтобы сделать static_cast вне класса или его друга. По сути, частное / защищенное наследование является наследованием реализации, а не наследованием интерфейса. Вот почему static_cast не работает.

1 голос
/ 18 декабря 2011

Да, это кажется правильным.У вас есть protected наследование, и A<B> не является производным от friend или B, поэтому он не может видеть базовый класс B, чтобы сказать, что static_cast допустим.

...