Я читал о спецификаторах доступа при применении наследования и знаю, что в private inheritance
мы не могли преобразовать производный класс в базовый, используя указатели/ссылки.
Но когда я использовал reinterpret_cast
, это сработало. ниже мой тестовый код:
class base {
int _a;
public:
base(int a): _a(a) {}
base(): _a(0) {}
};
class derived : private base
{
public:
derived(int b):base(b) {};
};
int main() {
derived b(25);
base &a = static_cast<base&>(b);//this line will generate a compile error
base &c = reinterpret_cast<base&>(b); //here it works
}
Итак, мой вопрос даже в частном наследовании, почему базовый класс будет выставлен с использованием retinterpret_cast
?
Благодарю вас!
//EDIT 2
class base {
int _a;
public:
base(int a): _a(a) {}
base(): _a(100) {}
~base() { std::cout << "deleting base" << _a << "\n"; }
};
class derived : private base
{
public:
virtual ~derived() = default;
derived(int b):base(b) {};
};
int main() {
derived b(25);
base &c = reinterpret_cast<base&>(b);
}
//OutPut : Deleting 25
static_cast
илиreinterpret_cast
для повышения или понижения. Вместо этого используйтеdynamic_cast
- person Asesh   schedule 03.07.2018reinterpret_cast
очень похож на старые приведения в стиле C, поскольку он в основном сообщает компилятору, что я знаю, что делаю, не беспокойте меня. Если вы на самом деле не знаете, что делаете, или допустили какие-либо ошибки, компилятор все равно не будет вас беспокоить и с радостью предоставит вам пистолет, чтобы вы могли выстрелить себе в ногу. - person Some programmer dude   schedule 03.07.2018static_cast
, приведения в стиле C,reinterpret_cast
компилируются как неоперативные (то есть код не генерируется, как для функции идентификации). Однакоdynamic_cast
имеет стоимость во время выполнения (и требует некоторого сгенерированного кода) - person Basile Starynkevitch   schedule 03.07.2018reinterpret_cast
по-прежнему компилируется, даже еслиderived
не наследуется отbase
совсем. - person davmac   schedule 03.07.2018