例子:
订户:
class Subscriber {};
基类:
class SubscribableChannel
{
public:
virtual ~SubscribableChannel() = default;
public:
auto subscribe(Subscriber&) -> void;
auto unsubscribe(Subscriber&) -> void;
private:
virtual auto internal_subscribe(Subscriber&) -> void = 0;
virtual auto internal_unsubscribe(Subscriber&) -> void = 0;
};
auto SubscribableChannel::subscribe(Subscriber& s) -> void
{ internal_subscribe(s); }
auto SubscribableChannel::unsubscribe(Subscriber& s) -> void
{ internal_unsubscribe(s); }
后代阶层SubscribableChannel:
class PubSubChannel : public SubscribableChannel
{
public:
PubSubChannel() = default;
private:
auto internal_subscribe(Subscriber&) -> void override {};
auto internal_unsubscribe(Subscriber&) -> void override {};
// Здесь появляется функция `unsubscribe`
// имя которой совпадает с именем одной из функций базового класса,
// но их сигнатуры отличаются: Subscriber& vs (Subscriber&, int)
auto unsubscribe(Subscriber&, int) -> void {}
};
结果,尝试调用函数unsubscribe:
PubSubChannel channel;
Subscriber s;
channel.unsubscribe(s);
,导致以下错误:
错误:没有用于调用“PubSubChannel::unsubscribe(Subscriber&)”的匹配函数
注意:候选人:'void PubSubChannel::unsubscribe(Subscriber&, int)'
问题:这种行为可以接受吗?如果是,请提供C++ 标准中的段落编号链接。
环境:linux,clang-10/gcc-10
这在
由于
PubSubChannel中有声明unsubscribe,因此不搜索基类。