3

derivbase がinside にアクセスできないのはなぜderivですか? プログラムは でコンパイルされclass deriv : public baseます。

#include <cstdio>

class base
{
};

class deriv : base
{
  public:
  void f(deriv, int){printf("deriv::f(deriv, int)\n");}
  void f(base){printf("deriv::f(base)\n");}
};

int main()
{
  deriv d;
  d.f(d);
}

17: error: ‘base’ is an inaccessible base of ‘deriv’
17: error:   initializing argument 1 of ‘void deriv::f(base)’

すでに 2 人が間違っているので、太字で質問します:なぜbase公に継承する必要があるのですか? 内部からのみアクセスできますderiv

4

3 に答える 3

6

キーワードを使用してクラスを定義すると、classメンバーと基本クラスはデフォルトでプライベートになります。

基本クラスをパブリックにする必要がある場合は、public(質問で述べたように)明示的に宣言するかstruct、デフォルトでパブリックにするキーワードを使用します。

なぜ基地は公開する必要があるのですか?

この場合、への呼び出しにはからへf(base)の変換が必要であり、そのような変換は基本クラスにアクセスできる場合にのみ可能です。プライベートであるため、変換が必要な場所ではアクセスできません。derivbasemain

于 2012-12-20T08:10:00.250 に答える
6

呼び出し時の からderivへの変換が「内部」で発生するため、アクセス可能である必要があると誤って想定しているようです。これはそうではありません。関数を呼び出すと、関数の引数を初期化するために必要なすべての変換が、呼び出し元のコンテキストで発生します。それらは「内側」ではありません。それらは「外の世界」で起こります。そしてあなたの場合、「外の世界」は変換にアクセスできません。basederiv::f(base)derivderivederivbase

あなたの特定のケースではmain、に変換しようとしderivていbaseます。mainのプライベート ベースにアクセスできないため、実行できませんderiv。実験int main()のために、フレンドとして宣言するderivと、コードがコンパイルされます。

于 2012-12-20T08:23:08.890 に答える
3

個人的に継承されているため:

class deriv : base

のデフォルトの継承classはプライベートです。つまり、他のクラスや関数は派生クラスの基本クラスにアクセスできません。


あなたの例には小さな問題があります。これ :

  deriv d;
  d.f(d);

スライスのためにあなたが期待することをするつもりはありません。

の署名を次のように変更して上記の問題を修正すると、次のようにfなります。

void f(base&){printf("deriv::f(base)\n");}

の基本クラスへのアクセスにはまだ問題があります。これは、基本クラスderivからプライベートに継承されているためです。

于 2012-12-20T08:10:01.887 に答える