2016-10-04 84 views
9

考虑结构的层次结构如下:遮盖力重载虚函数

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有两个版本。

+0

你使用什么编译器?我无法在gcc或MSVS中发出警告,但我在叮当中做了。 – NathanOliver

+0

是的,你隐藏它。那么你的问题是什么?如何消除详细的警告? – songyuanyao

+0

@NathanOliver我用clang,但是用g ++和警告显示不同的行为。 – phimuemue

回答

1

它抱怨说doit隐藏在Derived中。修正:

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

感谢您的suggeestion,但在具体情况下,我有'Derived1','Derived2',...,甚至可能是'doit1','doit2' ...,所以我不想重复所有这些在任何地方都使用''''''''''''''''''''''''''', – phimuemue

+0

@phimuemue使用这样的设计可能会更容易关闭警告。 '-Wno超载-virtual'。否则,你将不得不在所有地方洒“使用”,因为这就是名称隐藏在C++中的作用。 –