0

私は2つのクラスを持っています:

class MyAbstractClass
{
public:
 virtual const std::string& getStr() const =0;
}

class MyRealClass : public MyAbstractClass
{
public: 
virtual const std::string& getStr() const { return m_str;};

private:
std::string m_str;
}

私は主に持っています:

MyAbstractClass* ptr = new(MyRealClass("some string"));

MyRealClass 基本クラスへのポインタを介して格納されている文字列情報を取得したいと考えています。ptr情報を得るために何らかの方法でキャストする必要がありMyRealClassますか? またはランタイム環境は、私が実際getStrMyRealClass?

ptr->getStr(); または何か他のようなものですstatic_cast<MyRealClass*>(ptr)->getStr();dynamic_cast<MyRealClass*>(ptr)->getStr();

一般に、単純な (実際の) 基本クラスだけでなく、Abstract 基本クラスへのポインターを使用している場合、実際にキャストする必要がありますか?

4

3 に答える 3

2

必要なのはPolymorphismと呼ばれるもので、オブジェクト指向プログラミング言語 (C++ など) の機能です。

メソッドをポリモーフィックにするには、仮想としてタグ付けする必要があります (例で getStr() で行ったように)。メソッドが仮想である限り、派生クラスでそれらをオーバーライドできます。これらのメソッドをベースから呼び出す場合クラス ポインタは、インスタンス化したクラスのバージョンを呼び出します (例では MyRealClass)。それらを仮想としてタグ付けしない場合、それらはあなたが持っているポインターの型からメソッドのバージョンを呼び出します。(件名について詳しく知りたい場合は、「仮想テーブル」、「仮想ディスパッチ」、および「遅延バインディング」を検索してください)

書くときは次のことに注意してください。

virtual void someMethod() = 0;

純粋仮想メソッドとして知られているものを宣言しています。これらには独自の実装がないため、派生クラスでそれらを定義する必要があります (これが、C++ でインターフェイスと抽象クラスが作成される方法です)。

于 2013-11-09T19:32:10.187 に答える
0

派生クラスから基本クラスにキャストするには、 を使用できますstatic_castが、コンパイラはそれ自体で (実際にキャストを行う必要なく) 十分にスマートです。これで十分です:

MyAbstractClass* ptr = new(MyRealClass("some string"));

ただし、あなたの場合、基本クラスには仮想デストラクタがなく、削除時に得られるものは未定義の動作です。


ベースから派生にキャストしたい場合 - static_cast は十分ではありません。次に、dynamic_cast を使用して、成功したかどうかを確認する必要があります。

于 2013-11-09T19:26:12.847 に答える
0

いいえ; 抽象クラスを介して、抽象基本クラスの子へのポインターのメンバーを呼び出すことができます。あなたが示したコード例は不完全ですが。

インターフェイスに仮想デストラクタを追加し、具象クラスのコンストラクタを追加し、いくつかのセミコロンを消去すると、次のようになります。

#include<string>

class MyAbstractClass{
public:
  virtual const std::string& getStr() const = 0;

  virtual ~MyAbstractClass(){}
};

class MyRealClass : public MyAbstractClass{
public:
  MyRealClass(std::string str) :
    m_str(str)
  {}

  virtual const std::string& getStr() const{ 
    return m_str;
  }
private:
  std::string m_str;
};

これで、呼び出しMyAbstractClass* ptr = new MyRealClass("some string");によってptr->getStr()「何らかの文字列」が返されます。

于 2013-11-09T19:37:06.070 に答える