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

};

我还有一个类继承自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();
}

ETC

于 2013-02-12T20:22:21.893 回答
0

不,没有这样的方法。如果你想从基类调用虚函数,你应该直接这样做。

于 2013-02-12T20:21:07.630 回答
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 回答