【发布时间】:2020-06-25 16:17:32
【问题描述】:
我有一种情况,我正在使用公共 API 并且需要“覆盖”父类中的函数,但是该函数尚未声明为虚拟函数。虽然它很hacky,但我决定使用此处提到的代码更改父类函数的可见性:a way in c++ to hide a specific function。
但是,我遇到了一个问题,因为父类具有此函数的重载,并且参数非常相似,因此即使我已经创建了父类,我也会收到错误“对重载函数的模糊调用”在我的子类中,类的函数范围是私有的。我简化了下面的解决方案来说明问题:
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() 为私有时,为什么编译器甚至在父类的命名空间中搜索,我感到困惑?
我正在使用 MSVC 2019。
我不想做以下任何事情:
- 重命名我的子类函数(因为这会导致我的不一致)
- 将我的继承设为私有并手动公开我需要的函数(因为继承树非常大,这需要将祖父类中的许多函数也公开等等,这是不可持续的)
【问题讨论】:
-
重载解决方案在考虑访问修饰符之前发生。
-
@cdhowie 哦该死的,我该如何解决这个问题?
-
在
Child中,尝试删除继承的函数而不是将其设为私有:void doSomething(void*) = delete; -
@cdhowie 这不起作用,我得到“声明必须对应于指定基类中的纯虚成员函数”