回答編集履歴
1
解決例を追加
test
CHANGED
@@ -11,3 +11,30 @@
|
|
11
11
|
この本は (C++ の設計が委員会主導になる前の) 設計者自身によるものなので設計意図が表れている文章だと思います。
|
12
12
|
|
13
13
|
要するに派生クラスから全面的にアクセスできるようにするのは寛容すぎるということです。 派生クラスだけに許したいアクセスを (`protected` 以外の方法で) コントロールしようとすると煩雑すぎて管理不能になるという Mark Linton の主張が元で `protected` は導入されており、煩雑なインターフェイスを設計するためにバグが入り込むくらいなら緩いアクセス制限があったほうがマシだという判断がありました。 しかし、制限のための指定なのに緩すぎてもろくなことにならないのも自明なので典型的に必要な制限としてこのへんが落としどころだったということなのでしょう。
|
14
|
+
|
15
|
+
----
|
16
|
+
|
17
|
+
想定しているデザインが悪いのでどうにかする言語機能を探しても糊塗にしかならない (美しく解決するなら根本的な見直しが必要) ということはお断りしておきますが、 `protected` のルールを活用するという前提であればとにかく「派生クラスを経由する」ということを満たしさえすればよく、以下の例で示すような方法を取れなくはないですね。
|
18
|
+
|
19
|
+
```cpp
|
20
|
+
class A {
|
21
|
+
protected:
|
22
|
+
void call() { }
|
23
|
+
};
|
24
|
+
|
25
|
+
class B : public A {
|
26
|
+
struct C : private A {
|
27
|
+
C(const A& x) : A(x) {}
|
28
|
+
using A::call;
|
29
|
+
};
|
30
|
+
public:
|
31
|
+
void func(C a) { a.call(); }
|
32
|
+
};
|
33
|
+
|
34
|
+
int main(void) {
|
35
|
+
A foo;
|
36
|
+
B bar;
|
37
|
+
bar.func(foo);
|
38
|
+
}
|
39
|
+
```
|
40
|
+
|