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

Unhide certain function with same name and different signature from base class in derived

本文关键字:函数 基类 隐藏 取消 派生      更新时间:2023-10-16
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");
    }
};

因此,在这种情况下,我能够使用基类中的两个函数。但是是否可以允许在派生类中仅使用来自 base 的某些重载方法?例如,允许只使用 f(int(,而不能使用 f(int, int(。

不能

有选择地使用 using 指令取消隐藏基类方法。不幸的是,要么全有,要么全无。

这将可以:

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

如果您担心性能,这将导致静态调度到void Base::f(int)

实际上,可以通过

取消隐藏所有成员然后仅隐藏特定成员(例如,通过提供私有覆盖(来仅隐藏基类中的某些成员:

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'
}