子类调用父成员而不是其自己的成员

joa*_*dre 1 c++ inheritance class

我正在尝试通过两个从公共父类继承某些成员的类来实现几个共享许多属性的类。在实践中,改变的方式是它们如何处理特定成员,该成员也将被继承,这是父类其他成员所要求的:

#include <iostream>

class Parent{
public:
    Parent();
    Parent(const int _arg);
    ~Parent();
    int member1(const std::vector<float> _args);
    int member2(const std::vector<float> _args) { std::cout << shared(0.0) << std::endl;};
    int member3(const std::vector<float> _args);
    float shared(const float _val) {return 0.0;}; //dummy call in order for code to be compilable

protected:
    int protected_member1;
    int protected_member2;
    int protected_member3;
};

class Child1 : public Parent {
public:
    Child1(const int _arg):Parent(_arg);
    ~Child1();
    float shared(const float _val) {return 2.1;};
}

class Child2 : public Parent {
public:
    Child2(const int _arg):Parent(_arg);
    ~Child2();
    float shared(const float _val) {return 1.7;};
}
Run Code Online (Sandbox Code Playgroud)

在实践中,我shared(const float _val)做了一些更复杂且针对特定问题的事情,所以我尝试简化代码以更清楚地说明问题(并删除了代码中无关的部分作为剩余类成员的定义)。但是,当我member2(const std::vector<float> _args)从每个子类中调用时,称为基类成员shared(const float _val)而不是子成员。

int main(int argc, char const *argv[]){
    Parent p;
    Child1 c1;
    Child2 c2;

    c1.member2(std::vector<float> (5,1.0));
    c2.member2(std::vector<float> (5,1.0));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?以其他方式解决问题是否更有意义?

Bat*_*eba 5

默认情况下,C ++中不启用多态功能(例如,不同于Java)。您需要shared virtual在基类中进行标记:

virtual float shared(const float _val) {return 0.0;}
Run Code Online (Sandbox Code Playgroud)

如果您从不需要基类实现,则可以使其成为纯虚拟的

virtual float shared(const float _val) = 0;
Run Code Online (Sandbox Code Playgroud)

最后,在子类中,您也可以标记该功能virtual,尽管那没有效果。从C ++ 11开始,您可以override对函数使用关键字,该函数可以提高程序的健壮性,因为virtual从基类中退出将导致编译失败:

float shared(const float _val) override {return 2.1;}
Run Code Online (Sandbox Code Playgroud)