类的方法会覆盖另一个类的所有方法

时间:2014-02-18 21:03:52

标签: c++ override

来自func的方法DerivedClass会覆盖方法func及其BaseClass的所有重载。

#include <cstdio>

class BaseClass
{
    public:
        void func(int a){puts("BaseClass::func(int)");};
        void func(int a, int b){puts("BaseClass::func(int, int)");};
        void func(int a, int b, int c){puts("BaseClass::func(int, int, int)");};
        //...
};

class DerivedClass : public BaseClass
{
    public:        
        void func(int a){puts("DerivedClass::func(int)");}
        //...             
};

int main()
{           
    DerivedClass obj;
    obj.func(0);
    obj.func(0, 0);     // error
    obj.func(0, 0, 0);  // error      

    return 0;
}

如何修复此代码以在屏幕上结束:

DerivedClass::func(int)
BaseClass::func(int, int)
BaseClass::func(int, int, int)

修改1 在函数main中不应该改变任何东西

2 个答案:

答案 0 :(得分:5)

派生类的成员函数不会覆盖基类,它隐藏它们。要将它们全部扩展到范围,请使用using声明:

class DerivedClass : public BaseClass
{
    public:        
        void func(int a){puts("DerivedClass::func(int)");}
        using BaseClass::func;
        //...             
};

Live example

答案 1 :(得分:2)

这是设计:这种现象被称为“名字隐藏”。

[简短回答]:

C ++不喜欢这样的想法,即在一个子类中调用一个具有一组特定参数的基函数的长期行为,并选择隐藏每个基类中的所有重载< / strong>解决这个问题。

[长答案]此处: https://stackoverflow.com/a/1629074/1938163


作为一种解决方法,你可以将对象强制转换为适当的基础并调用你需要的函数(虽然有一个强制转换惩罚),或者通过指定它的基类直接调用你需要的函数

int main()
{           
    DerivedClass obj;
    obj.func(0);
    obj.BaseClass::func(0,0);

    return 0;
}

Live Example

或者您可以使用“using directive”

取消隐藏它们
class DerivedClass : public BaseClass
{
    public:        
        void func(int a){puts("DerivedClass::func(int)");}
        using BaseClass::func;
        //...             
};

Live Example