TransWikia.com

How to make this operator= overload work?

Stack Overflow Asked on November 15, 2021

I was experimenting with making the operator= be virtual, like so:

#include <iostream>
#include <string>

class Base {
public:
    std::string field1;
    Base(std::string str) : field1(str) {}

    virtual Base& operator=(const Base& other)
    {
        field1 = other.field1;
        return *this;
    }
};

class Derived : public Base {
public:
    std::string field2;
    Derived(std::string str1, std::string str2) : Base(str1), field2(str2) {}

    virtual Derived& operator=(const Derived& other) override
    {
        Base::operator=(other);
        field2 = other.field2;
        return *this;
    }
};

However, this gives a compiler error, because the Derived function is not actually overloading anything, the signatures are different.

Is it possible to override the operator= to write code like this?

Base* ptr = new Derived("old 1", "old 2");
Derived derived("new 1", "new 2");

*ptr = derived; // <- use the derived class operator= to assign both field1 and field2

One Answer

This operator

virtual Derived& operator=(const Derived& other);

does not override the copy assignment operator declared in the base class.

You have to write

Derived& operator=(const Base& other) override;

That is the type of the parameter shall be const Base &.

Here is a demonstrative program.

#include <iostream>

struct A
{
    virtual A & operator =( const A & )
    {
        std::cout << "A::operator =n";
        return *this;
    }
};

struct B : A
{
    virtual B & operator =( const A &a ) override
    {
        A::operator =( a );
        std::cout << "B::operator =n";
        return *this;
    }
};


int main() 
{
    B b1;
    
    A &rb1 = b1;
    
    B b2;
    b2 = rb1;
    
    return 0;
}

Its output is

A::operator =
B::operator =

Answered by Vlad from Moscow on November 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP