c++ - Wrapper implementation for an abstract method in the base class -
i have base class inherited many subclasses. need define new signature abstract method, wrapper. tried
class b { public: virtual void f() = 0; void f(string msg) { /* print msg , call f() */ } }; class d : public b { public: void f() override { /* implementatation */} }; int main() { d d; d.f("msg"); } but doesn't compile , give following error
error: no matching function call 'd::f(string) my questions are:
- why cannot
d::f(string)resolved? - why of following fix problem?
- renaming
f(string)f2(string)(ugly) - defining
d::f(string x) { b::f(x)}(ugly has defined in every subclasses) - removing abstract method,
b::f()(not acceptable)
- renaming
any better solution?
the issue hid b::f(std::string) here:
class d : public b { public: void f() override; }; when call d.f("msg"), name lookup find 1 f() in d , stop looking. first find candidate functions then perform overload resolution. since 1 happens take no arguments, compile error.
if want use other overload of f, need bring d well, so:
class d : public b { public: using b::f; void f() override; }; now have d::f() (the overridden virtual function) , d::f(std::string ) (which brought in b).
an alternative, trivial solution rename 1 or other function don't have problem begin with.
Comments
Post a Comment