以下コードでコンパイラが嫌がる理由嫌がるようにした理由が分からないです
以下のようなコードを書いてコンパイルしたのですが、
protected within this context
というエラーが発生してコンパイルできません
Baseクラスにfriendをつければコンパイルは可能なのですが、
Baseクラスは抽象クラスですし、
実際に使用される場合ExtendクラスのBaseポインタには派生クラスであるAクラスのポインタが格納されるのでfriendつけるのは派生先だけで十分であるように思います。
基本クラスがまだ普通のクラスならばコンパイラが怒るのも納得できるのですが、
抽象クラスだったら継承クラスすべてでfriend宣言されていれば、別に怒る必要はないと思うのですが、コンパイラは何がそんなにいやなんでしょうか?(多分昔のc++コンパイラなら許してるのでは?)
#include <iostream> using namespace std; class Base { //friend class Extend; //コメントアウト切ったらエラーは消える protected : virtual int print() const = 0; protected : virtual ~Base() {} }; class A : public Base { friend class Extend; public : A(int k) : n(k) {} private : int n; int print() const { return n; } }; class Extend { public : Extend(int); public : ~Extend() { delete p; }; //deleteしたいがprotectecなので怒る private : Base* p; }; Extend::Extend(int n) { p = new A(n); } int main(void) { }

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。