最小的例子:
class A {};
class B : public virtual A {};
class C : public virtual B {};
// define two overloading virtual functions
// no inheritance, so no overriding/hiding in this class
struct visitor1
{
virtual void visit(A& ) {}
virtual void visit(B& ) {}
virtual ~visitor1();
};
// covariant types are not allowed for overriding virtuals,
// so the C-visit function would hide A and B, so we add them
// using the "using" keyword
struct visitor2 : public visitor1
{
using visitor1::visit;
virtual void visit(C& ) {}
virtual ~visitor2();
};
// the B-visit is a correct override
// without the use of "using" (or the C-visit) below, the
// compiler warns that the C-visit function from visitor3
// is being overridden
struct visitor3 final : public visitor2
{
//using visitor2::visit;
//void visit(C &) override {}
void visit(B &) override {}
};
编译器:
$ clang++ -Wall -Wextra -Weverything -Wno-c++98-compat visitor.cpp
visitor.cpp:32:14: warning: 'visitor3::visit' hides overloaded virtual function [-Woverloaded-virtual]
void visit(B &) override {}
^
visitor.cpp:20:22: note: hidden overloaded virtual function 'visitor2::visit' declared here: type mismatch at 1st parameter ('C &' vs 'B &')
virtual void visit(C& ) {}
^
问题(假设来自visitor3的评论行保持评论):
- 为什么编译器会抱怨它
visitor3::visit(B&)
正在隐藏visitor2::visit(C&)
? - 为什么它不抱怨
visitor3::visit(B&)
隐藏visitor1::visit(A&)
(这里有什么不同)?
附加问题:我如何实现这两者visitor2::visit(C&)
而visitor1::visit(A&)
不是隐藏visitor3
?using visitor2::visit;
够用吗visitor3
?