我有一种情况,我正在使用公共(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。
我不想做以下任何一项:
最佳答案
最简单的方法就是不使用 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/