web-dev-qa-db-ja.com

継承でプライベートメンバーにアクセスする

クラスAがあり、プライベートとして宣言されたフィールドvalがあります。 Aから継承し、valにアクセスできるクラスBを宣言します。 C++でそれを行う方法はありますか?

Aコードをまったく変更せずに、Aの一部の機能をオーバーロードする必要があるため、これを実行したいと思います。

ありがとう。

26
ofer

クイックアンサー:しません。これがprotectedキーワードの目的です。サブクラスへのアクセスを許可し、それ以外には許可しない場合に使用します。

privateは、サブクラスではなく、これらの変数に誰もアクセスできないことを意味します。

Aのコードをまったく変更できない場合は、その変数にpublic/protectedアクセスメソッドがある可能性があります。それ以外の場合、これらの変数はサブクラスからアクセスされることを意図しておらず、ハックのみが助けになります(これはお勧めしません!)。

45
Constantinius

基本クラスのプライベートメンバーは、基本メンバー関数によってのみアクセスできます(派生クラスではありません)。だから、あなたはそうする機会さえない権利を持っていません:)

class Base

  • public:誰でもアクセス可能
  • プライベート:ベースメンバ関数(派生クラスではない)のみがアクセスできます
  • 保護:基本メンバー関数と派生クラスの両方からアクセス可能
16

基本クラスにアクセスできる場合は、クラスBを friend class として宣言できます。しかし、他の人が説明したように、あなたができるからといって、それが良いアイデアだということではありません。派生クラスからアクセスできるようにする場合は、保護されたメンバーを使用します。

8
dbrank0

これは今週の第一人者の説明どおりに実行可能です。 GotW#76-アクセス権の使用と乱用 。しかし、それは最後の手段と考えるべきです。

3
Eoin

protectedとして定義する必要があります。保護されたメンバーは子クラスに継承されますが、外部からはアクセスできません。

1
Meysam