gpt4 book ai didi

c++ - "hidden overloaded virtual function"超过 2 个类

转载 作者:行者123 更新时间:2023-11-30 03:19:41 30 4
gpt4 key购买 nike

最小的例子:

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 中?在 visitor3 中使用 visitor2::visit; 是否足够?

最佳答案

void visit(B&) 的声明或名为visit 的成员的任何声明(它可能是数据成员int visit; ) 在 visitor3 中隐藏名为 visit 的父级的任何成员。

这里编译器的警告更像是个好东西。它识别出一个常见的错误模式,即在不考虑重载的情况下重写基本虚拟成员函数。但它不会检测所有隐藏名称,或者不会对所有隐藏名称发出警告。无论如何,来自 visitor1visitor2 的所有 visit 都是隐藏的。

附加答案:命名基类成员的 using 声明是基类中具有该名称且可见的所有成员在派生类内部的声明。因此,这实际上包括了在基类中也由 using 声明声明的成员。

(这些由 using 声明声明的成员表现得非常接近,就好像它们是在该类中首次声明的实际成员一样。即使重载决策也将它们的隐含对象参数视为派生类的类型。)

关于c++ - "hidden overloaded virtual function"超过 2 个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53458030/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com