teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

内容の修正

2019/02/07 16:41

投稿

mmmisaki
mmmisaki

スコア34

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- 以下コードでコンパイラが嫌がる理由が分からないです
1
+ 以下コードでコンパイラが~~嫌がる理由~~嫌るようにした理由が分からないです
2
2
  ---
3
3
  以下のようなコードを書いてコンパイルしたのですが、
4
4
  protected within this context
@@ -8,7 +8,7 @@
8
8
  Baseクラスは抽象クラスですし、
9
9
  実際に使用される場合ExtendクラスのBaseポインタには派生クラスであるAクラスのポインタが格納されるのでfriendつけるのは派生先だけで十分であるように思います。
10
10
  基本クラスがまだ普通のクラスならばコンパイラが怒るのも納得できるのですが、
11
- 抽象クラスだったら継承クラスすべてでfriend宣言されていれば、別に怒る必要はないと思うのですが、コンパイラは何がそんなにいやなんでしょうか?
11
+ 抽象クラスだったら継承クラスすべてでfriend宣言されていれば、別に怒る必要はないと思うのですが、コンパイラは何がそんなにいやなんでしょうか?(多分昔のc++コンパイラなら許してるのでは?)
12
12
 
13
13
  ```ここに言語を入力
14
14
  #include <iostream>
@@ -16,7 +16,7 @@
16
16
  using namespace std;
17
17
 
18
18
  class Base {
19
- //friend class Extend;
19
+ //friend class Extend; //コメントアウト切ったらエラーは消える
20
20
  protected : virtual int print() const = 0;
21
21
  protected : virtual ~Base() {}
22
22
  };
@@ -29,7 +29,7 @@
29
29
  };
30
30
  class Extend {
31
31
  public : Extend(int);
32
- public : ~Extend() { delete p; };
32
+ public : ~Extend() { delete p; }; //deleteしたいがprotectecなので怒る
33
33
  private :
34
34
  Base* p;
35
35
  };