-3
class Widget{ .. }  // Widget Class

class Interface { // pure virtual functions .. } // Interface class (Abstract Class)

class WidgetType1 : public Widget, public Interface { ... } // Type 1 Widget (ComboBox) inherits widget and Interface
class WidgetType2 : public Widget, public Interface { ... } // Type 2 Widget (LineEdit) inherits widget and Interface

Widget* widget = getWidget(...);
Interface* interface = dynamic_cast<Interface*> (widget); // Convert Widget to Interface

Widgetのオブジェクト(基本的にはWidgetType 1/2)のインターフェイスのメソッドにアクセスするにはどうすればよいですか

Widgetのポインタで参照されているWidgetType1のキャストオブジェクトを入力できません

デザインの画像

4

2 に答える 2

1

私は私のコメントを答えにしています:私の推測では、:に括弧を追加するのを忘れたためにコンパイラエラーが発生するでしょうdynamic_cast

Interface* interface = dynamic_cast<Interface*>(widget)

dynamic_cast実行時に正しく動作するには、RTTIを使用してプロジェクトをコンパイルする必要があります(実行時型情報、ウィキペディアの記事へのリンク)。誤解されているかもしれませんが、コンパイラはデフォルトでRTTIを有効にしていると思いますので、無効にしたかどうかを知っておく必要があります。

于 2013-01-02T11:58:41.123 に答える
0

class Widgetエラーの実装を示したり、エラーの性質を説明したりしていないため、これは単なる推測です。

class Widget{ ... };  // Widget Class
...
Interface* interface = dynamic_cast<Interface*> (widget); 

クラス仕様の最後にセミコロンが欠けていたことに注意してください。これだけでも、問題の原因になる可能性があります。

別の可能性: クラスに対するあなたのコメントはInterface、そのクラスに対して仮想メソッドが定義されていることを具体的に示しています。クラスに対するあなたのコメントWidgetは、そのようなことは何も言いません。Widgetクラスの仮想メソッドを定義しないポリモーフィック クラスではありません。非多態性クラスへのポインターを動的にキャストできるのは、親クラスのポインターだけです。Interfaceは の親クラスではありません。仮想メソッドがないWidget場合、動的クラスを作成することは違法です。Widget

于 2013-01-02T13:06:28.037 に答える