clang在编译以下代码时发出警告:
struct Base
{
virtual void * get(char* e);
// virtual void * get(char* e, int index);
};
struct Derived: public Base {
virtual void * get(char* e, int index);
};
Run Code Online (Sandbox Code Playgroud)
警告是:
warning: 'Derived::get' hides overloaded virtual function [-Woverloaded-virtual]
Run Code Online (Sandbox Code Playgroud)
(当然需要启用上述警告).
我不明白为什么.请注意,在Base中取消注释相同的声明会关闭警告.我的理解是,由于两个get()函数具有不同的签名,因此不能隐藏.
clang对吗?为什么?
请注意,这是在MacOS X上,运行最新版本的Xcode.
clang --version
Apple LLVM version 5.0 (clang-500.1.74) (based on LLVM 3.3svn)
Run Code Online (Sandbox Code Playgroud)
更新:与Xcode 4.6.3相同的行为.
说我们有这个:
class A
{
public:
virtual void foo() = 0;
};
class B: public A
{
public:
virtual void foo() = 0;
};
Run Code Online (Sandbox Code Playgroud)
编译器不会抛出错误,我猜它是因为B也是一个抽象类,因此它不必foo从A 实现.但这样的构造意味着什么?
1)fooB foo从A 隐藏吗?
2)继承自B并且不是抽象类的第一个类,它必须提供两个实现,如:
class C: public B
{
public:
virtual void A::foo() {};
virtual void B::foo() {};
};
Run Code Online (Sandbox Code Playgroud)
编译器只会抱怨如果B::foo()缺少实现,但它不会抱怨丢失A::foo().
总而言之:这是一种隐藏纯虚方法的方法吗?