継承を適用するときにアクセス指定子について読んで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
プライベート継承に違反していますか?あんまり。
C ++のアクセシビリティは、有効な方法で何かを参照するために識別子を使用できるスコープにのみ影響します。このシステムは、あなたが使用するようなマキャベリアのトリックではなく、マーフィーから保護するように設計されています。
reinterpret_cast
基本的には、コンパイラに「知っていることを忘れて、代わりに私の判断を信頼してください」と言っているのです。そうです。この左辺値は実際にはbase
?を参照しているとあなたは主張します。いいでしょう、あなたのやり方で。しかし、コンパイラはあなたを保護するために何もするつもりはありません、それはあなたがあなたが何をしているかを知っていると仮定します。非常に簡単に壊れます。@Daniの例があり、これがあります:
class derived : private base
{
public:
virtual ~derived() = default;
derived(int b):base(b) {};
};
を使用c
するメンバー関数を使用して呼び出そうとするとどうなると思います_a
か?代わりに何が見つかりますか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加