私はこのコードを持っています.2行がコメントアウトされていることに注意してください
#include <iostream>
class foo {
public:
foo();
int i;
};
class bar: foo {
public:
bar();
//int i;
};
foo::foo()
{
i = 2;
}
bar::bar()
{
i = 4;
}
int main()
{
bar *b = new(bar);
//std::cout << "bi = " << b->i << std::endl; /*line 28*/
foo *f = (foo*) b;
std::cout << "fi = " << f->i << std::endl;
}
2 行をコメントアウトすると、コードがコンパイルされ、出力は次のようになります。
fi = 4
2 行のコメントを外すと、コードがコンパイルされ、出力は次のようになります。
bi = 4
fi = 2
クラスバー内の i の宣言のみをコメントアウトすると、コンパイルは失敗します
var.cc: In function ‘int main()’:
var.cc:6:7: error: ‘int foo::i’ is inaccessible
var.cc:28:30: error: within this context
最初の 2 つのケースは理解できますが、このコンパイル エラーは理解できません。なぜですか
変数 "i" はバー コンストラクター内からアクセスできますが、バー ポインターからはアクセスできませんか?