6

私は以下を持っています

class base
{
};

class derived : public base
{
  public:
   derived() {}
   void myFunc() { cout << "My derived function" << std::endl; }

};

今私が持っています

base* pbase = new derived();
  pbase->myFunc();

myFunc is not a member function of base というエラーが表示されます。

これを回避する方法は?myFuncを呼び出す方法は?

基本クラスには関数が含まれていないことに注意してください。これは設計の一部であり、上記のコードは大きな関数の一部であるためです

4

4 に答える 4

6

myfuncは基本クラスからアクセスできる必要があるため、 で public virtual を宣言する必要がありmyfuncますbasebase抽象基底クラス、つまりインスタンス化できず、インターフェイスとして機能するクラスにする場合は、純粋な仮想にすることができます。

class base
{
 public:
  virtual void myfunc() = 0; // pure virtual method
};

baseオブジェクトをインスタンス化できるようにしたい場合は、次の実装を提供する必要がありmyfuncます。

class base
{
 public:
  virtual void myfunc() {}; // virtual method with empty implementation 
};

基本クラスへのポインターから関数にアクセスする場合、これを行うための他のクリーンな方法はありません。最も安全なオプションは、dynamic_cast

base* pbase = new derived;

....
derived* pderived = dynamic_cast<derived*>(pbase);
if (derived) {
  // do something
} else {
  // error
}
于 2012-11-19T09:10:16.600 に答える
6

この関数が base の一部であってはならないことに固執している場合は、それを行うためのオプションが 2 つしかありません。

派生クラスへのポインターを使用するか

derived* pDerived = new derived();
pDerived->myFunc();

または (より醜い&激しくお勧めしません) static_castポインタを派生クラス型まで上げてから、関数を呼び出します:注意して使用してください。キャストしているポインタの型が確実である場合にのみ使用してください。つまり、 がまたは から派生した型であることが確実です。この特定のケースでは問題ありませんが、これは実際のコードの例にすぎないと推測しています。
pbasederivedderived

base* pbase = new derived();
static_cast<derived*>(pbase)->myFunc();
于 2012-11-19T09:15:23.490 に答える
3

基本クラス ポインターを使用するには、基本クラスの定義を次のように変更する必要があります。

class base
{
public:
    virtual void myFunc() { }
};

他に方法はありません。ごめん。

于 2012-11-19T09:10:45.157 に答える
1

それを base のメンバーとして追加して、それを仮想または純粋仮想関数にすることができます。ただし、このルートを使用する場合は、基本クラスに仮想デストラクタを追加して、継承されたオブジェクトを正常に破棄できるようにする必要があります。

class base
{
public:
   virtual ~base(){};
   virtual void myFunc() = 0;
};

class derived : public base
{
  public:
   derived() {}
   void myFunc() { cout << "My derived function" << std::endl; }

};
于 2012-11-19T09:11:05.760 に答える