c++ - 隐藏重载的虚函数

标签 c++ overloading virtual member-hiding

考虑以下结构层次结构:

struct I1 {
    virtual void doit() = 0;
};

struct I2 {
    virtual void doit(int) = 0;
};

struct I12 : I1, I2 {
    using I1::doit;
    using I2::doit;
};

struct Derived : I12 {
    void doit(int) override {}
};

编译这个(使用 clang,或 g++-Woverloaded-virtual)给我一个警告:

'Derived::doit' hides overloaded virtual function [-Woverloaded-virtual]

但是,如果我将 I12 更改为以下内容,它在 clang 下编译正常,而 g++ -Woverloaded-virtual 仍然会给出警告:

struct I12 : I1, I2 {
    using I1::doit;
    void doit(int) override = 0;
};

using I2::doitvoid doit(int) override = 0 有什么区别?天真地,我会认为前者足以通知编译器我知道 doit 有两个版本。

最佳答案

它提示 doit 隐藏在 Derived 中。修复:

struct Derived : I12 {
    using I12::doit; // Bring all doit declarations from I12 into this scope.
    void doit(int) override {}
};

关于c++ - 隐藏重载的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39851669/

相关文章:

c++ - swift 编译器无法找到 C++ 库

c++ - 从偏移量读取写入

c++ - 错误 : No match for 'operator>>' Overloading istream operator

c++ - error LNK2019 未解析的外部符号虚拟类

c++11 - 无法使用 SFINAE (std::enable_if) 覆盖虚函数

python - 逼近大型对称矩阵的最高 3 个特征值和特征向量的快速方法

c++ - 使用 str[i] -'0' 的目的是什么,其中 str 是一个字符串?

java - Var-args 重载

java - 为什么 String.valueOf(null) 会抛出 NullPointerException?

c++ - 为什么 C++ 支持带实现的纯虚函数?