reinterpret_castがプライベート継承で機能する理由

血-ハザード

継承を適用​​するときにアクセス指定子について読んで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
StoryTeller-Unslander Monica

プライベート継承に違反していますか?あんまり。

C ++のアクセシビリティは、有効な方法で何かを参照するために識別子を使用できるスコープにのみ影響します。このシステムは、あなたが使用するようなマキャベリアのトリックではなく、マーフィーから保護するように設計されています。

reinterpret_cast基本的には、コンパイラに「知っていることを忘れて、代わりに私の判断を信頼してください」と言っているのですそうです。この左辺値は実際にはbase?を参照しているとあなたは主張します。いいでしょう、あなたのやり方で。しかし、コンパイラはあなたを保護するために何もするつもりはありません、それはあなたがあなたが何をしているかを知っていると仮定します。非常に簡単に壊れます。@Daniの例があり、これがあります:

class derived : private base
{
public:
    virtual ~derived() = default;
    derived(int b):base(b) {};  
};

を使用cするメンバー関数を使用して呼び出そうとするどうなると思います_aか?代わりに何が見つかりますか?

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

プライベート継承でコンストラクターがどのように機能するか

分類Dev

C ++-プライベート継承でもデフォルトコンストラクタが機能するのはなぜですか

分類Dev

プライベートリンクでもインクルードパスが継承される理由

分類Dev

このreinterpret_castがクラッシュする理由

分類Dev

プライベート継承と仮想機能

分類Dev

継承でプライベート変数を使用する

分類Dev

Perl6でプライベート属性を継承する

分類Dev

C ++の多重継承で使用されるreinterpret_cast

分類Dev

reinterpret_castによるプライベートデータへのアクセス

分類Dev

reinterpret_castが機能する場合と機能しない場合があるのはなぜですか?

分類Dev

ハードウェアSIMDベクトルポインターと対応するタイプの間の `reinterpret_cast`ingは未定義の動作ですか?

分類Dev

Javascriptの継承:ネイティブプロトタイプ間でプロトタイプチェーンがどのように機能するか

分類Dev

なぜプライベート継承でオーバーライドするのですか?

分類Dev

なぜこれが機能するのですか?(多重継承、スライス)

分類Dev

このタイプの継承が機能するのはなぜですか?

分類Dev

なぜポインターポインターをreinterpret_castする必要があるのですか?

分類Dev

私のカーネルドライバーでは「reinterpret_cast」が未定義です

分類Dev

クラス階層に沿ったプライベート継承、階層全体に友達が必要な理由

分類Dev

プライベートコンストラクターを継承する

分類Dev

ブートストラップCSS(3.2)がモバイルとデスクトップで機能する理由

分類Dev

クラステンプレートの継承はGCCでのコンパイルに失敗しますが、VisualStudioでは機能します

分類Dev

PHPforeachでjs / jqueryイベントが機能する理由

分類Dev

パブリック継承を禁止するが、プライベート(および保護された)継承を許可する方法

分類Dev

明示的な型キャストでプライベート継承のアップキャストが許可されるのはなぜですか?

分類Dev

JavaScriptでプライベート関数を継承できますか?

分類Dev

JavaScriptでプライベート関数を継承できますか?

分類Dev

NSObjectから継承するときにプライベート関数で変数を初期化する

分類Dev

C ++で問題を引き起こすプライベート継承

分類Dev

onsubmitイベントハンドラーがphpインタープリターで機能しない理由

Related 関連記事

  1. 1

    プライベート継承でコンストラクターがどのように機能するか

  2. 2

    C ++-プライベート継承でもデフォルトコンストラクタが機能するのはなぜですか

  3. 3

    プライベートリンクでもインクルードパスが継承される理由

  4. 4

    このreinterpret_castがクラッシュする理由

  5. 5

    プライベート継承と仮想機能

  6. 6

    継承でプライベート変数を使用する

  7. 7

    Perl6でプライベート属性を継承する

  8. 8

    C ++の多重継承で使用されるreinterpret_cast

  9. 9

    reinterpret_castによるプライベートデータへのアクセス

  10. 10

    reinterpret_castが機能する場合と機能しない場合があるのはなぜですか?

  11. 11

    ハードウェアSIMDベクトルポインターと対応するタイプの間の `reinterpret_cast`ingは未定義の動作ですか?

  12. 12

    Javascriptの継承:ネイティブプロトタイプ間でプロトタイプチェーンがどのように機能するか

  13. 13

    なぜプライベート継承でオーバーライドするのですか?

  14. 14

    なぜこれが機能するのですか?(多重継承、スライス)

  15. 15

    このタイプの継承が機能するのはなぜですか?

  16. 16

    なぜポインターポインターをreinterpret_castする必要があるのですか?

  17. 17

    私のカーネルドライバーでは「reinterpret_cast」が未定義です

  18. 18

    クラス階層に沿ったプライベート継承、階層全体に友達が必要な理由

  19. 19

    プライベートコンストラクターを継承する

  20. 20

    ブートストラップCSS(3.2)がモバイルとデスクトップで機能する理由

  21. 21

    クラステンプレートの継承はGCCでのコンパイルに失敗しますが、VisualStudioでは機能します

  22. 22

    PHPforeachでjs / jqueryイベントが機能する理由

  23. 23

    パブリック継承を禁止するが、プライベート(および保護された)継承を許可する方法

  24. 24

    明示的な型キャストでプライベート継承のアップキャストが許可されるのはなぜですか?

  25. 25

    JavaScriptでプライベート関数を継承できますか?

  26. 26

    JavaScriptでプライベート関数を継承できますか?

  27. 27

    NSObjectから継承するときにプライベート関数で変数を初期化する

  28. 28

    C ++で問題を引き起こすプライベート継承

  29. 29

    onsubmitイベントハンドラーがphpインタープリターで機能しない理由

ホットタグ

アーカイブ