Trouble with inheritance of operator= in C++ -
i'm having trouble inheritance of operator=. why doesn't code work, , best way fix it?
#include <iostream> class { public: & operator=(const & a) { x = a.x; return *this; } bool operator==(const & a) { return x == a.x; } virtual int get() = 0; // abstract protected: int x; }; class b : public { public: b(int x) { this->x = x; } int get() { return x; } }; class c : public { public: c(int x) { this->x = x; } int get() { return x; } }; int main() { b b(3); c c(7); printf("b: %d c: %d b==c: %d\n", b.get(), c.get(), b==c); b = c; // compile error // error: no match 'operator= in 'b = c' // note: candidates b& b::operator=(const b&) printf("b: %d c: %d b==c: %d\n", b.get(), c.get(), b==c); return 0; }
if not declare copy-assignment operator in class, compiler declare 1 implicitly. implicitly declared copy-assignment operator hide inherited assignment operators (read "name hiding" in c++), meaning inherited assignment operators become "invisible" unqualified name lookup process (which happens when b = c), unless take specific steps "unhide" them.
in case, class b has no explicitly declared copy-assignment operator. mean compiler declare
b& b::operator =(const b&) implicitly. hide operator inherited a. line
b = c; does not compile, because, candidate here above implicitly declared b::operator = (the compiler told already); other candidates hidden. , since c not convertible b&, above assignment not compile.
if want code compile, can use using-declaration unhide inherited a::operator = adding
using a::operator =; to definition of class b. code compile, although won't style. have keep in mind in case b = c assignment invoke a::operator =, assigns a portions of objects involved. (but apparently intent.)
alternatively, in cases can work around name hiding using qualified version of name
b.a::operator =(c);
Comments
Post a Comment