c++ - 父类私有(private)函数导致同名同参数子类公有函数调用不明确

标签 c++ class

我有一种情况,我正在使用公共(public) API 并且需要“覆盖”父类中的函数,但是该函数尚未声明为虚拟函数。虽然它很 hacky,但我决定使用此处提到的代码更改父类函数的可见性:a way in c++ to hide a specific function .
但是,我面临一个问题,因为父类具有具有非常相似参数的此函数的重载,因此即使我已经确定了父类的函数范围,我也会收到错误“对重载函数的模糊调用”在我的 child 类是私有(private)的。我简化了下面的解决方案来说明问题:

class Parent
{
public:
    void doSomething(void* pointer) {}
};

class Child : public Parent
{
public:
    void doSomething(const char* pointer) {}
    
private:
    using Parent::doSomething;
};

int main()
{
    Child childInstance;
    childInstance.doSomething(nullptr);     // error: 'Parent::doSomething': ambiguous call to overloaded function
}
这是一个错误吗?如果没有,我该如何解决这个问题?当我明确声明 doSomething() 时,我对为什么编译器甚至在父类的命名空间中搜索感到困惑。作为私有(private)?
我正在使用 MSVC 2019。
我不想做以下任何一项:
  • 重命名我的子类函数(因为这会导致我的不一致)
  • 将我的继承私有(private)化并手动公开我需要的函数(因为继承树非常大,这需要将祖父类中的许多函数也公开等等,这是不可持续的)
  • 最佳答案

    最简单的方法就是不使用 using指令放在首位。
    继承的函数已经隐藏,因为您有一个同名的函数。 using指令显式地取消隐藏该重载,这实际上会产生您要解决的问题。

    class Child : public Parent
    {
    public:
        void doSomething(const char* pointer) {}
    };
    
    根据 Child 的定义, 继承的 void doSomething(void*);过载被隐藏。偶Child foo; foo.doSomething(static_cast<void*>(nullptr));不会编译!
    如需调用Parent上的版本来自Child ,您只需限定调用:Parent::doSomething(arg); .
    假设您的问题特定于 nullptr ,您还可以声明一个额外的重载,该重载采用 std::nullptr_t ,这始终是 nullptr 的最佳匹配:
    class Child : public Parent
    {
    public:
        void doSomething(const char* pointer) {}
        void doSomething(std::nullptr_t) {
            doSomething(static_cast<const char*>(nullptr));
        }
        
    private:
        using Parent::doSomething;
    };
    

    关于c++ - 父类私有(private)函数导致同名同参数子类公有函数调用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62579822/

    相关文章:

    c++ - 在 C++11 中对数组中所有元素的 OR/AND 成员进行 OR/AND 的优雅方式?

    c++ - Hook OutputDebugStringA 引发异常

    c++ - 从队列中显示二维数组后程序崩溃

    用于嵌套类的 Javascript css 选择器

    c++ - 隐藏私有(private)数据成员? (C++)

    swift - 扫描 BLE 设备并将它们呈现在 UITableView 中

    c++ - 如何让最小化和最大化按钮出现在 wxDialog 对象上

    c++ - Lua 可以访问和调用成员函数的 c++ 对象数组

    android - 从 java 传递给 jni 的参数返回奇怪的值

    ios - UIFont 类在 Swift 中崩溃的应用程序