2012-04-05 12 views
1

方法論を呼び出す際には明確な説明が必要です。基本クラスがあり、派生クラスオブジェクトを使用して派生クラス関数を呼び出そうとしています。それは間違って何派生クラス関数をBaseクラスから呼び出すことは可能ですか

このsenarioに

Plsのは間違っていただきました私のコードで私に言うことができ

#include "stdafx.h" 
#include <malloc.h> 

class derived; 

class base 
{ 
public: 
    base() 
    { 

    } 
    ~base() 
    { 
    } 

    void setdptr(derived* dptr) 
    { 
     m_dptr = dptr; 
     dptr->sayHello(); 
    } 

    virtual void addfunc() 
    { 

     printf("base class add"); 
    } 

    derived *m_dptr; 

}; 

class derived : public base 
{ 
public: 
    derived() 
    { 
    } 
    ~derived() 
    { 
    } 

    void addfunc() 
    { 
     printf("derived class add"); 
    } 

    void sayHello() 
    { 
      printf("Say Hello"); 
    } 

    void setDeriveToBase() 
    { 
     setdptr(this); 
    } 

}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    derived dp; 
    dp.setDeriveToBase(); 
    return 0; 
} 
+0

あなたの質問は何ですか? – orlp

+0

派生クラス関数をBaseクラスから呼び出すことはできますか? – Naruto

答えて

1

コンパイラは、まだメンバーがderivedにいるのか分からないように、あなたはまだ定義されderivedクラスfulleを持っていません。

の定義setdptrderivedの宣言の後に移動すると正常に動作します。このような

何か:

class derived; 

class base 
{ 
    // .... 

    void setdptr(derived* dptr); 

    // .... 
}; 

class derived : public base 
{ 
    // .... 
}; 

void base::setdptr(derived* dptr) 
{ 
    m_dptr = dptr; 
    dptr->sayHello(); 
} 
+0

ありがとうJoachim Pileborg ... – Naruto

1

であること

void setdptr(derived* dptr) 
{ 
    m_dptr = dptr; 
    dptr->sayHello(); 
} 

が違法であるということです。 derivedへのフォワード宣言だけを提供するので、コンパイラは存在すること以外はクラスについて何も知らないので、そこからメソッドを使用することはできません。

実装から宣言を分離し、実装をcppファイルに移動し、そのファイルにderivedを定義するヘッダーを含める必要があります。

しかし、基底クラスから派生したメソッドを呼び出すことはコードの臭いです。を実行する必要はありません。クラスbasesetdptr機能で

関連する問題