2012-05-01 17 views
1

私はC++を本当に(本当に)長い時間使っていません。この質問は愚かかもしれませんが、私は本当に助けを必要とします。C++で基本クラスのプライベートメンバーにアクセスする

私の基底クラスにプライベートデータメンバーがあり、派生クラスがパブリックに派生している場合、基本クラスのプライベートメンバーは継承されません。しかし、継承されたパブリック関数を介してアクセスできます。例えば次のように

class B{ 
int a,b; 

public: 
void SetA(int); 
int GetA(); 
}; 

class D:public B{ 

public: 
SetAAttribute(int x) 
{ SetA(x); } 

} 

、私の質問は: 技術的には、派生クラスのオブジェクトは、それらの上に定義された「」属性を持っていません。素人の言葉では、基本的に、属性が最初に存在しない場合でも、エンティティに属性を設定しています。このような概念を想像するのは直感的ではないようです。私はこれを正しく理解しましたか?

追加の説明や修正があれば幸いです。

+0

'a'属性が存在するため、プライベートであるため直接アクセスできません。 –

+0

基本クラスメンバに継承されるように 'protected'を設定できますが、そうでなければプライベートプロパティがあります。 – chris

答えて

7

属性がもう存在しないということではなく、それはあなたから隠されているということだけです。基本クラスのメソッドは、互いに隠れていないので、基本クラスのメンバにアクセスできます。

+0

属性は基本クラスオブジェクトで定義されていますか?派生クラスに対してこの属性を設定すると、実際には存在しません。私的メンバーは決して継承されないので隠されているわけではありません。例: 'color'がプライベートベースクラスの属性で、派生オブジェクトがパブリック継承された関数を介してcolor属性を設定する場合、それは派生オブジェクトに設定されますか? – Bugaboo

+0

@Bugaoo、私的メンバーは継承されていますが、私が言ったように彼らは隠されています。それらを使用しようとすると、コンパイラは存在しないかのように文句を言います。しかし、彼らはまだそこにいる。 'sizeof'を実行すると、サイズに隠れたメンバーが含まれていることがわかります。 color属性を設定し、基本クラスがオブジェクトの描画を担当する場合は、派生クラスから設定された色で描画します。 –

+0

ありがとうございました。さらなるフォローアップの質問。ソリューションを設計するときは、属性をプライベートとして持ち、パブリック継承された関数を使用してアクセスするか、または基本クラスで保護された属性としてマークし、派生クラスで直接アクセスしますか? – Bugaboo

2

プライベートベースメンバは継承されています。コンパイラは、それらにアクセスしようとするとエラーになります。なぜなら、それらに直接アクセスすることは想定されていないからです。

関連する問題