存取函数可以调用纯虚拟函数吗?

时间:2019-08-07 00:37:02

标签: c++ virtual

如果我的纯虚函数是

virtual string func()=0;

它可以返回访问器函数吗?

编辑:对于较早的困惑,我深表歉意,因此我要添加示例代码

class Parent{
  public:
   parent(void){};
   virtual string func()=0;
   string getFunc (void) const{return var=func();} ;
  protected: 
   string var;
}
class Child: public  Parent{

public:
 class Child(void); 

string func(){
 string random // this is very generic I actually pretend 
               //to do some math here and return a string
 return random}; 

我的意图是然后使用实例化的子对象并要求accessor(getFunc())返回一个值,该值我只能基于func()进行计算。但是错误指出虚拟函数的性质不允许返回,坦率地说,我发现这很奇怪,因为它上面确实有return标记。

1 个答案:

答案 0 :(得分:-1)

在另一个成员函数中调用纯virtual函数根本不是问题。 (不幸的是,OP没有复制/粘贴确切的错误消息。)

不幸的是,公开的OP示例具有很多错别字,语法错误和其他弱点。

解决了这个问题,我发现了一个重要的问题:const的{​​{1}}型。

Parent::getFunc()调用一个非常量成员函数 并对该变量Parent::getFunc()进行突变,该变量未被编译器接受。

删除this->var即可。

固定示例:

const

输出:

#include <iostream>
#include <string>

class Parent{
  public:
    Parent() = default;

    virtual std::string func() = 0; // PURE VIRTUAL

    std::string getFunc() // WRONG: const
    {
      return var = func();
    }

  protected: 
    std::string var;
};

class Child: public Parent {

  public:
    Child() = default; 

    virtual std::string func() override
    {
      std::string random; // this is very generic I actually pretend 
               //to do some math here and return a string
      return random;
    }
};

#define DEBUG(...) std::cout << #__VA_ARGS__ << ";\n"; __VA_ARGS__ 

int main()
{
  DEBUG(Child child);
  DEBUG(child.getFunc());
}

Live Demo on coliru


尽管,Child child; child.getFunc(); 访问器(我将其称为“ getter”)似乎是合理的。再进行一些重新设计,就可以实现:

const

输出:与上面相同

Live Demo on coliru

注意:

  1. 我制作了#include <iostream> #include <string> class Parent{ public: Parent() = default; virtual std::string func() const = 0; // PURE VIRTUAL std::string getFunc() const { return var = func(); } protected: mutable std::string var; }; class Child: public Parent { public: Child() = default; virtual std::string func() const override { std::string random; // this is very generic I actually pretend //to do some math here and return a string return random; } }; #define DEBUG(...) std::cout << #__VA_ARGS__ << ";\n"; __VA_ARGS__ int main() { DEBUG(Child child); DEBUG(child.getFunc()); } virtual func(),以使其可用于const实例/成员函数。

  2. 成员变量变为const,使其可以在mutable成员函数中写入。

我必须承认我个人觉得const有点吓人。以我简单的想法,某事是mutable或不是。但是,const似乎只是为了更新实际mutable对象的内部缓存而发明的。因此,这可能是正确的工具。 (没有更多上下文很难说。)

有关const的更多信息:mutable specifier