【问题标题】:Virtual function call虚函数调用
【发布时间】:2013-02-12 20:18:44
【问题描述】:

这是我的类层次结构。

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

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() 函数时,我看到了日志"AuthenticateIn::CreateJson"。我想找到一种方法来调用CreateJson(),它将为所有基类调用。

我知道我可以从AuthenticateInCreateJson 函数调用this-&gt;UIData::CreateJson() 来做到这一点,但是有没有其他方法可以做到这一点,一些自动的方法?谢谢!!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你必须像这样在派生类中调用基类函数:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          您可能无法强制调用虚拟基类,但您可以使用间接来模拟行为。

          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
          

          【讨论】:

            猜你喜欢
            • 2012-02-06
            • 2015-09-17
            • 2016-06-12
            • 2018-11-09
            • 2011-08-06
            • 2012-01-28
            • 2021-07-07
            • 1970-01-01
            相关资源
            最近更新 更多