父类的私有函数导致子类中具有相同名称和相似参数的公共函数模棱两可的调用

加里·艾伦

我遇到的情况是我正在使用公共API,并且需要“覆盖”父类中的函数,但是该函数尚未声明为虚拟。尽管它很笨拙,但是我已经决定使用下面提到的代码来更改父类函数的可见性:这是c ++中隐藏特定函数的一种方式

但是,我遇到了一个问题,即父类对该函数的重载具有非常相似的参数,因此,即使我已使父类的函数成为作用域,但仍会收到错误消息“歧义调用重载函数”在我的孩子课堂上不公开。我简化了以下解决方案以说明问题:

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。

我不想执行以下任一操作:

  • 重命名我的子类函数(因为这将导致我的不一致)
  • 将我的继承设为私有,并手动将我需要的功能公开(因为继承树非常大,这将要求将祖父母类中的众多功能也公开,等等,这是不可持续的)
maximum_prime_is_463035818

这是一个错误吗?我对为什么编译器甚至在父类的名称空间中进行搜索感到困惑

编译器不必查看父类。您明确地告诉他您要使用Parent::doSomething;

此外,重载解析发生在私有/公共访问之前(参见cppreference):

成员访问不会影响可见性:私有和私有继承成员的名称是可见的,并通过重载解析加以考虑,仍会考虑对不可访问的基类的隐式转换,等等。成员访问检查是解释任何给定语言构造之后的最后一步。该规则的目的是,用公共场所替换任何私人场所绝不会改变程序的行为。

两种重载都是同等好的匹配,因此模棱两可。传递avoid*应该可以选择所需的重载:

childInstance.doSomething(static_cast<void*>(nullptr));

要使方法从Parentas中隐藏private并解决歧义,可以添加一个间接级别:

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

class Intermediate : public  Parent {
   using Parent::doSomething;
};

class Child : public Intermediate
{
public:
    void doSomething(const char* pointer) {}
};

int main()
{
    Child childInstance;
    void* p;
    //childInstance.doSomething(p); // error
    childInstance.doSomething(nullptr); // fine
}

intermediate保证Parent::doSoemthing是私人和通话不再是模糊的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重新定义且模棱两可的函数调用具有数组参数

来自分类Dev

具有依赖类型的c ++ 11可变函数模板重载是否模棱两可?

来自分类Dev

使用具有类的合格名称的字符串调用通用模棱两可的方法

来自分类Dev

C ++中的重载函数为unsigned char和unsigned int导致模棱两可

来自分类Dev

C ++中的重载函数为unsigned char和unsigned int导致模棱两可

来自分类Dev

具有Action <T>参数重载的模棱两可的方法调用

来自分类Dev

具有Action <T>参数重载的模棱两可的方法调用

来自分类Dev

为什么Array和Integer构造函数模棱两可

来自分类Dev

错误:对重载函数的模棱两可的调用

来自分类Dev

(C++) 构造函数,默认参数,“调用重载...模棱两可”

来自分类Dev

python中具有相同名称的函数的子类

来自分类Dev

对于具有==运算符的多个覆盖的类,空检查是模棱两可的

来自分类Dev

为什么对模版化函数有一个模棱两可的要求?

来自分类Dev

带有自己的类和std :: string_view的'operator =='的模棱两可的重载

来自分类Dev

vs 2013和GCC之间的全局函数和模棱两可的参数NULL vs. char *

来自分类Dev

如何从具有相同名称IsTesting()的类方法中调用内置函数IsTesting()?

来自分类Dev

将if-else函数应用于数据帧中的每个单元会导致模棱两可的异常

来自分类Dev

为什么传递值和传递右值重载c ++函数调用是模棱两可的?

来自分类Dev

C ++构造函数与相同键/值类型的std :: map模棱两可

来自分类Dev

C ++构造函数与相同键/值类型的std :: map模棱两可

来自分类Dev

putchar()函数:模棱两可的输出

来自分类Dev

在Ruby中调用具有相同名称的函数和方法

来自分类Dev

在Ruby中调用具有相同名称的函数和方法

来自分类Dev

对成员函数set_value的错误调用是模棱两可的(在使用pugixml库的xcode中)

来自分类Dev

如何使用公共获取器创建带有私有字段的Scala类,并且主构造函数采用相同名称的参数

来自分类Dev

如何解决这个模棱两可的模板构造函数调用?

来自分类Dev

错误C2668:'boost :: bind':对重载函数的模棱两可的调用

来自分类Dev

.ctor模棱两可,因为类中存在多种使用此名称的成员

来自分类Dev

xml验证失败,具有必需的属性和不允许的属性错误,这是模棱两可的

Related 相关文章

  1. 1

    重新定义且模棱两可的函数调用具有数组参数

  2. 2

    具有依赖类型的c ++ 11可变函数模板重载是否模棱两可?

  3. 3

    使用具有类的合格名称的字符串调用通用模棱两可的方法

  4. 4

    C ++中的重载函数为unsigned char和unsigned int导致模棱两可

  5. 5

    C ++中的重载函数为unsigned char和unsigned int导致模棱两可

  6. 6

    具有Action <T>参数重载的模棱两可的方法调用

  7. 7

    具有Action <T>参数重载的模棱两可的方法调用

  8. 8

    为什么Array和Integer构造函数模棱两可

  9. 9

    错误:对重载函数的模棱两可的调用

  10. 10

    (C++) 构造函数,默认参数,“调用重载...模棱两可”

  11. 11

    python中具有相同名称的函数的子类

  12. 12

    对于具有==运算符的多个覆盖的类,空检查是模棱两可的

  13. 13

    为什么对模版化函数有一个模棱两可的要求?

  14. 14

    带有自己的类和std :: string_view的'operator =='的模棱两可的重载

  15. 15

    vs 2013和GCC之间的全局函数和模棱两可的参数NULL vs. char *

  16. 16

    如何从具有相同名称IsTesting()的类方法中调用内置函数IsTesting()?

  17. 17

    将if-else函数应用于数据帧中的每个单元会导致模棱两可的异常

  18. 18

    为什么传递值和传递右值重载c ++函数调用是模棱两可的?

  19. 19

    C ++构造函数与相同键/值类型的std :: map模棱两可

  20. 20

    C ++构造函数与相同键/值类型的std :: map模棱两可

  21. 21

    putchar()函数:模棱两可的输出

  22. 22

    在Ruby中调用具有相同名称的函数和方法

  23. 23

    在Ruby中调用具有相同名称的函数和方法

  24. 24

    对成员函数set_value的错误调用是模棱两可的(在使用pugixml库的xcode中)

  25. 25

    如何使用公共获取器创建带有私有字段的Scala类,并且主构造函数采用相同名称的参数

  26. 26

    如何解决这个模棱两可的模板构造函数调用?

  27. 27

    错误C2668:'boost :: bind':对重载函数的模棱两可的调用

  28. 28

    .ctor模棱两可,因为类中存在多种使用此名称的成员

  29. 29

    xml验证失败,具有必需的属性和不允许的属性错误,这是模棱两可的

热门标签

归档