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

时间:2018-01-03 17:14:55

标签: c++ class inheritance

我正在尝试通过两个继承公共父类中某些成员的类来实现一些共享大量属性的类。在实践中,它们如何处理特定成员的方式发生了变化,这些成员也将被继承,因为它需要来自父类的其他成员:

#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;};
}

在实践中,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;
}

我做错了什么?这个问题的不同方法会更有意义吗?

1 个答案:

答案 0 :(得分:5)

默认情况下,C ++中没有打开多态性(例如,与Java不同)。您需要在基类中标记shared virtual

virtual float shared(const float _val) {return 0.0;}

如果您从不需要基类实现,那么您可以将其设为纯虚拟

virtual float shared(const float _val) = 0;

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

float shared(const float _val) override {return 2.1;}