【问题标题】:Implementing pure virtual function in the abstract class - is there any use of it? [duplicate]在抽象类中实现纯虚函数 - 有什么用吗? [复制]
【发布时间】:2014-10-21 05:05:59
【问题描述】:

我刚刚注意到我可以在抽象类本身中实现纯虚函数。 GCC 没有抱怨。这种实现有什么用吗?任何人都可以使用它吗?

class AbstractClass
{
    virtual void PureVirtualFunction() = 0;
};

void AbstractClass::PureVirtualFunction() //Is there any use of this implementation?
{
    cout << "I am inside pure virtual function of AbstractClass" << endl;
}

class DerivedClass : public AbstractClass
{
    public:
        void PureVirtualFunction();
};

void DerivedClass::PureVirtualFunction()
{
    cout << "I am inside pure virtual function of DerivedClass" << endl;
}

【问题讨论】:

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


    【解决方案1】:

    例如,您可以从DerivedClass 实现中调用它(如果AbstractClass::PureVirtualFunction 不是私有的):

    void DerivedClass::PureVirtualFunction()
    {
        AbstractClass::PureVirtualFunction();
        cout << "I am inside pure virtual function of DerivedClass" << endl;
    }
    

    或者即使它是私有的,您也可以从 AbstractClass 本身调用它:

    class AbstractClass
    {
        virtual void PureVirtualFunction() = 0;
    
    public:
        void CallPureVirtualFunction() {
            AbstractClass::PureVirtualFunction();
        }
    };
    
    DerivedClass().CallPureVirtualFunction();
    
    I am inside pure virtual function of AbstractClass
    

    【讨论】:

      【解决方案2】:

      您可以使用它来提供一个可供派生类访问的默认实现。

      一种可能的用法是“亲爱的派生类作者,这个虚函数非常重要,我想确定你知道你在用它做什么。我将提供一个默认实现,但您必须明确地使用它。”这将像这样完成:

      class AbstractClass
      {
      public:
          virtual void PureVirtualFunction() = 0;
      };
      
      void AbstractClass::PureVirtualFunction() //Is there any use of this implementation?
      {
          cout << "I am inside pure virtual function of AbstractClass" << endl;
      }
      
      class DerivedClass : public AbstractClass
      {
          public:
              void PureVirtualFunction();
      };
      
      void DerivedClass::PureVirtualFunction()
      {
          AbstractClass::PureVirtualFunction();
      }
      

      【讨论】:

      • 这不起作用,因为 PureVirtualFunction 是私有的。
      • @ontherocks 谢谢,已修复。
      猜你喜欢
      • 2017-01-15
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2019-12-08
      相关资源
      最近更新 更多