如果我的纯虚函数是
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标记。
答案 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());
}
尽管,Child child;
child.getFunc();
访问器(我将其称为“ getter”)似乎是合理的。再进行一些重新设计,就可以实现:
const
输出:与上面相同
注意:
我制作了#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
实例/成员函数。
成员变量变为const
,使其可以在mutable
成员函数中写入。
我必须承认我个人觉得const
有点吓人。以我简单的想法,某事是mutable
或不是。但是,const
似乎只是为了更新实际mutable
对象的内部缓存而发明的。因此,这可能是正确的工具。 (没有更多上下文很难说。)
有关const
的更多信息:mutable specifier