1

方法論を呼び出す際に明確にする必要があります。基本クラスがあり、そこから派生クラスオブジェクトを使用して派生クラス関数を呼び出そうとします。出来ますか

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;
}
4

2 に答える 2

1

何が悪いのか

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

違法です。に前方宣言を提供するだけderivedなので、コンパイラはクラスが存在すること以外は何も知らないため、そこからメソッドを使用することはできません。

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

しかし、基本クラスから派生メソッドを呼び出すことはコードの臭いであり、それを行う必要はありません

于 2012-04-05T09:41:46.027 に答える
1

クラスのsetdptr関数でbaseは、derivedクラスfulleがまだ定義されていないため、コンパイラはにどのメンバーが含まれているかをまだ認識していませんderived

の実際の定義setdptrの宣言の後に移動するderivedと、機能するはずです。

このようなもの:

class derived;

class base
{
    // ....

    void setdptr(derived* dptr);

    // ....
};

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

void base::setdptr(derived* dptr)
{
    m_dptr = dptr;
    dptr->sayHello();
}
于 2012-04-05T09:44:54.570 に答える