私はCRTPクラスの階層を実装しようとしています。 、第予想通り第一派生クラス(fromA
)をコンパイルし、実行が次のCRTP階層がコンパイルされないのはなぜですか?
#include <iostream>
template <class Derived>
class A {
public:
void showv() {
std::cout << static_cast<const Derived*>(this)->v << std::endl;
}
};
template <class Derived>
class B : public A<Derived> {
typedef A<Derived> base;
friend base;
};
class fromA : public A<fromA> {
typedef A<fromA> base;
friend base;
protected:
int v = 1;
};
class fromB : public B<fromB>
{
typedef B<fromB> base;
friend base;
protected:
int v = 2;
};
int main()
{
// This runs ok
fromA derived_from_a;
derived_from_a.showv();
// Why doesn't the following compile and complains about the protected member?
fromB derived_from_b;
derived_from_b.showv();
return 0;
}
:私はチェーンダウン派生クラスのデータメンバにアクセスできるように、基本クラスに興味(fromB
)、これはA
から派生したクラスに由来します。
- フレンド宣言が配信されない理由は何ですか?
- 回避策についてのご意見はありますか?
なぜ、仮想関数getV()を作成してお友達とのゲームの代わりに、それぞれの派生クラスでオーバーライドしないのですか? –
私の 'friend'の' friend'はC++の私の友達ではありません。 – Jarod42