1

これが私のクラスの階層です。

次の抽象インターフェイス クラスを宣言しました。関数は 1 つだけです。

class IAuthenticator
{
public:
    virtual void CreateJson() = 0;
};

より多くのクラス 'UIData' を作成し、それをインターフェイス クラスから継承した後、この場合は次のようになります。

class UIData : public IAuthenticator
{
protected:
    UIData() : mWindowHandle(0) 
    { /* Constructor do nothing. **/ }

private:
    integer mWindowHandle;

public:
    void CreateJson()
    {
        std::cout<<"UIData::CreateJson\n";
    }

};

から継承するもう1つのクラスがありますUIData

class AuthenticateIn : public UIData
{
private:
    string mOrigin;
    string mLogoURL;
    string mUserID;

public:
    void CreateJson()
    {
        std::cout<<"AuthenticateIn::CreateJson\n";
    }
};

質問

私の主な機能では、このようなコードを書いています。

int main()
{
    AuthenticateIn* ai = new AuthenticateIn();
    ai->CreateJson();
}

CreateJson()関数を呼び出すと、 log が表示されます"AuthenticateIn::CreateJson"。呼び出す方法を見つけたいのですがCreateJson()、すべての基本クラスに対して呼び出されます。

クラス関数this->UIData::CreateJson()から呼び出すことができることは知っていますが、それを行う他の方法、自動化された方法はありますか? ありがとう !!AuthenticateInCreateJson

4

4 に答える 4

3

それを行う他の方法はありますか、いくつかの自動方法

いいえ、ありません。派生クラスから基本クラスの実装を呼び出す必要があります。コンパイラは、実際にこれが必要かどうかわからないため、これを自動的に行いません。

于 2013-02-12T20:21:04.833 に答える
1

次のような派生クラスで基本クラス関数を呼び出す必要があります。

void CreateJson() {
    UIData::CreateJSon();
}

于 2013-02-12T20:22:21.893 に答える
0

仮想基本クラスへの呼び出しを強制できない場合がありますが、間接参照を使用して動作をシミュレートできます。

typedef int integer;

#include <iostream>
#include <string>

using std::string;
using std::cout;
class IAuthenticator
{
public:
    virtual void CreateJson() = 0;
};

class UIData : public IAuthenticator
{
protected:
    UIData() : mWindowHandle(0)
    { /* Constructor do nothing. **/ }

private:
    integer mWindowHandle;
    virtual void CreateJsonPrivate() = 0;

public:
    void CreateJson()
    {
        CreateJsonPrivate();
        std::cout<<"UIData::CreateJson\n";
    }

};

class AuthenticateIn : public UIData
{
private:
    string mOrigin;
    string mLogoURL;
    string mUserID;

    virtual void CreateJsonPrivate()
    {
        std::cout<<"AuthenticateIn::CreateJson\n";
    }
};

int main()
{
    AuthenticateIn* ai = new AuthenticateIn();
    ai->CreateJson();
}

出力:

AuthenticateIn::CreateJson
UIData::CreateJson
于 2013-02-13T01:00:39.540 に答える
0

いいえ、そのような方法はありません。基本クラスから仮想関数を呼び出したい場合は、これを直接行う必要があります。

于 2013-02-12T20:21:07.630 に答える