在派生中取消隐藏与基类相同名称和不同签名的某些函数

时间:2012-02-28 11:26:40

标签: c++ oop inheritance overloading

class Base
{
public:
    virtual void f(int)
    {
        printf("Base f(int)\n");
    }

    virtual void f(int, int)
    {
        printf("Base f(int, int)\n");
    }
};

class Der : public Base
{
public:
    using Base::f;

    virtual void f(double)
    {
        printf("Der f(double)\n");
    }
};

所以在这种情况下我可以使用基类中的两个函数。但是,是否可以允许在派生类中使用某些特定的重载方法?例如,允许仅使用f(int),但不使用f(int,int)。

3 个答案:

答案 0 :(得分:4)

无法有选择地取消使用using指令的基类方法。不幸的是,这是全有或全无。

答案 1 :(得分:3)

这样做:

class Der : public Base {
...
  virtual void f(int p) { return Base::f(p); }

如果您关注性能,则会导致静态调度到void Base::f(int)

答案 2 :(得分:0)

实际上,通过取消隐藏所有成员然后再隐藏特定成员(例如通过提供私有覆盖),可以仅隐藏基类中的某些成员:

struct Base
{
    void f(int) {
        printf("Base f(int)\n");
    }

    void f(int, int) {
        printf("Base f(int, int)\n");
    }
};

struct Der : Base
{
    using Base::f; // unhide all f's from Base

    void f(double) {
        printf("Der f(double)\n");
    }

// hide f(int, int) from Base by declaring it as private (no implementation needed)
private:
    void f(int, int); 
};

void Example() {
    Der der;
    der.f(1); // OK Base::f(int)
    der.f(1.0f); // OK Der::f(double)
    der.f(1,1); // compiler error: 'f' is a private member of 'Der'
}