我试图覆盖Vector_container中的size函数,但是IDE告诉我“标记为'override'的非虚拟成员函数会隐藏虚拟成员函数”
class Container {
public:
virtual double& operator[](int) = 0; // pure virtual function
virtual int size() const = 0; // const member function (§4.2.1)
virtual ~Container() {} // destructor (§4.2.2)
};
class Vector_container : public Container { // Vector_container implements Container
public:
Vector_container(int s) : v(s) { } // Vector of s elements
~Vector_container() {}
double& operator[](int i) override { return v[i]; }
int size() override { return v.size(); }
private:
Vector v;
};
但这不是虚函数吗?
答案 0 :(得分:1)
在这里,稳定性很重要。当您尝试覆盖Container
时,您的int size() const
声明了一个纯虚拟的int size()
。根据我的测试,将您的替代声明为const
works。
答案 1 :(得分:1)
正如其他人提到的那样,使用const可以更改函数的签名。我想补充一些知识点,将来会帮助其他人。
在C ++中重写函数时,如果编译器支持C ++ 11及更高版本,请在函数签名末尾使用 override 关键字。这将从编译器中获得更多有用的信息。如果虚拟函数具有override关键字,则编译器随后可能导致程序在编译时失败。如果编译器找不到具有相同函数签名的父虚拟函数,则将发生错误。与运行时相比,在编译时发现错误几乎总是更好。
它似乎就像您输入了override关键字一样,因此很可能为您指明了正确的方向。我为此感到困惑的主要原因是,我希望看到该问题的其他人意识到您可以在编译时捕获该关键字的错误覆盖。
人们在行业中通常的做法是提供具有和不具有 const 的基本功能。尽管许多人可能会说这违反了const的目的,但在某些情况下,您可能需要在非const函数或非const对象上调用const函数。唯一的其他选择是使用可变的,我发现很少有C ++程序员理解其含义。
简而言之,const会更改函数的签名,因此,如果const签名匹配,则只能在子类上重写。