虚函数调用

时间:2013-02-12 20:18:44

标签: c++ abstract-class multiple-inheritance virtual-functions

这是我的等级类。

我已经声明了以下抽象接口类,它只有一个函数:

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

问题

在我的main函数中,我编写了这样的代码。

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

当我调用CreateJson()函数时,我会看到log "AuthenticateIn::CreateJson"。我想找到一种方法来调用CreateJson(),它将被调用所有基类。

我知道我可以从this->UIData::CreateJson()AuthenticateIn函数调用CreateJson,但有没有其他方法可以做到这一点,一些自动方式?谢谢!!

4 个答案:

答案 0 :(得分:3)

  

有没有其他方法可以做到这一点,一些自动方式

不,没有。您必须从派生类调用基类的实现。编译器不会自动执行此操作,因为它不知道您实际上是否想要这个。

答案 1 :(得分:1)

您必须在派生类中调用基类函数,如下所示:

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

答案 2 :(得分:0)

不,没有这样的方法。如果要从基类调用虚函数,则应直接执行此操作。

答案 3 :(得分: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