为什么我不能覆盖继承的功能?

时间:2015-10-19 15:30:43

标签: c++

当我尝试编译下一个构造时,我遇到了错误:无法从' std :: vector< _Ty>'转换参数1到'漂浮' 为什么要发生这种情况?

class A
{
public:
    virtual int action(float)
    {return 5;}

    virtual int action(std::vector<float>)
    {return 10;}
};

class B : public A
{
public:
    int action(float) override
    {return 6;}
};

class C : public B
{
public:
    int action(std::vector<float>) override
    {
       B::action(std::vector<float>());
       return 7;
    }
};

int main()
{
   C instance;
   int temp = instance.action(std::vector<float>());
   getchar();
   return 0;
}

2 个答案:

答案 0 :(得分:2)

如果派生类使用相同的名称声明函数,编译器会搜索父类中的重载。通常,如果您启用了警告,编译器会发出警告:

  

警告:&#39; C :: action&#39;隐藏重载的虚函数[-Woverloaded-virtual]

如果指定声明重载的范围,则调用将起作用:

A::action(std::vector<float>());

但更一般地说,你应该总是避免重载虚函数。

答案 1 :(得分:2)

当编译器看到函数调用

>>> y1 = np.array([[1, 2], [1, 3], [1, 2], [2, 2]])
>>> y2 = np.array([[100, 200], [100,300], [100, 200], [200, 200]])
>>> z = np.array([1, 2])
>>>
>>> (y1 == z).all(1).any()
True
>>> (y2 == z).all(1).any()
False

需要两个步骤来决定需要进行哪个函数调用。在第一步中,它会查找名称B::action(std::vector<float>()); 。如果查找导致一个或多个函数,则会停止查找。它不会查找基类中的重载函数。如果查找导致多个函数名称,则会尝试重载解析。

在您的情况下,查找仅生成一个函数 - action。查找在那里停止。但是,该函数与正在使用的参数不匹配。因此,编译器将其报告为错误。

我可以想出以下解决问题的方法。

int B::action(float)的所有重载都可以在A::action

中查找
B

更改通话,以便使用class B : public A { public: using A::action; int action(float) override {return 6;} };

A::action(float)

我强烈建议使用第一种方法。