6

f最初の関数のオーバーロードを解決しないという呼び出しがなぜですか?エラーが発生します:

source.cpp: In function 'int main()':
source.cpp:12:31: error: 'A' is an inaccessible base of 'B'

class A {}; class B : A {};

void f(const A &)  { std::cout << "const A &"; }
template <typename T> void f(T) { std::cout << "Generic";  }

int main() {

   B b;

   f(dynamic_cast<const A &>(b));

}

コードを取り出すとdynamic_cast、コードは機能しますが、2番目 fのコードが呼び出されます(「Generic」と出力されます)。しかし、私がやろうとしているのは、最初の電話を受けることです。うまくいくと思いましたdynamic_castが、どういうわけか問題が発生します。私はここで何が間違っているのですか?

4

4 に答える 4

10

デフォルトのクラス継承はprivateです(class B : A {};デフォルトはclass B : private A {};)。

bしたがって、タイプを処理することはできませんA

編集:ロブが言ったように:)、それを修正する方法は、パブリック継承を使用することです:

class B : public A {};

編集:公的に
派生し たクラスとその基本クラスの関係は「is a」です。これは、より一般的な型の特殊化であり、そのため、その一般的なクラスの動作を実装し、場合によってはそれ以上の動作を実装します。

プライベート派生クラスとその基本クラスの間の関係は、 「の観点から実装」されます。オブジェクトが基本クラスの拡張と見なされるのを防ぎます。その使用の良い例はboost::noncopyable、プライベート派生クラスのオブジェクトがコピーされないようにすることです。 http://www.boost.org/doc/libs/1_52_0/libs/utility/utility.htm#Class_noncopyable

要件にプライベート継承が含まれ、ある時点でオブジェクトをベースとして参照する関数が作成されるという仮定の場合、ベースクラスポインターにキャストされたパブリックメソッドは、従来のプライベートデータメンバーへのアクセスthisと同じように実行します。get()本来の目的を維持します。

public:
    A *getBase() { return static_cast<A *>(this); }

そして、次のようにアクセスします。

f(b.getBase());
于 2012-12-13T23:00:30.043 に答える
4

Aはのプライベートベースであるため、タイプのオブジェクトを。として扱うことができるB場所はほとんどありません。継承をpublicに変更すると、キャストが機能し、テンプレート以外のバージョンのを選択します。しかし、やり過ぎです。タイプのすべてのオブジェクトはタイプのオブジェクトであるため、呼び出しを明確にするために使用できます。BA&fdynamic_castBAstatic_cast

于 2012-12-13T23:04:04.357 に答える
2

アップキャストに関しては特別なことは何もありませんdynamic_cast。そのような場合dynamic_castと同等です。static_castベースが存在し、明確で、アクセス可能である場合は、コンパイル時に実行されます。それ以外の場合はコンパイルに失敗します。

これはまさにあなたの場合に起こることです。(コンパイラがすでに言ったように)ベースにアクセスできないため、キャストはコンパイルに失敗します。

キャストがない場合、最初の関数はオーバーロード解決候補リストから除外され(ベースにアクセスできないため)、2番目の関数が優先されます。

実際、圧倒的多数のケースで合法的なアップキャストを実行するためにキャストは実際には必要ありません。違法なアップキャストに関しては、C ++キャストはそれを助けません(プライベート継承を「突破」できる唯一のキャストはCスタイルのキャストです)。

于 2012-12-13T23:03:13.527 に答える
0

b前述のように、プライベート継承のため、およびオブジェクトとして渡されるため、失敗します。dynamic_castポインタと参照に対してのみ機能します。

参照:http ://www.cplusplus.com/doc/tutorial/typecasting/

于 2012-12-13T23:04:45.073 に答える