#include <assert.h> // assert
#include <string> // std::string
using namespace std;
struct Person
{
string name;
void setValue( Person const& other )
{
name = other.name;
}
void operator=( Person const& other ) { setValue( other ); }
Person( string const& _name )
: name( _name )
{}
};
struct Student
: Person
{
int studentId;
void setValue( Student const& other )
{
Person::setValue( other ); // Copies the name part.
studentId = other.studentId; // Copies the id part.
}
void operator=( Student const& other ) { setValue( other ); }
Student( string const& _name, int const _studentId )
: Person( _name ), studentId( _studentId )
{}
};
int main()
{
Person a( "Hillary Clinton" );
Student b( "John Smith", 12345 );
a = b; // Only the Person::operator= matches the arguments.
// Here there is no `a.studentId`. The Student value has been SLICED.
// The executed operator=() function copies only the name attribute.
assert( a.name == b.name );
}
I2luY2x1ZGUgPGFzc2VydC5oPiAgICAgICAgIC8vIGFzc2VydAojaW5jbHVkZSA8c3RyaW5nPiAgICAgICAgICAgLy8gc3RkOjpzdHJpbmcKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBQZXJzb24KewogICAgc3RyaW5nICBuYW1lOwoKICAgIHZvaWQgc2V0VmFsdWUoIFBlcnNvbiBjb25zdCYgb3RoZXIgKQogICAgewogICAgICAgIG5hbWUgPSBvdGhlci5uYW1lOwogICAgfQogICAgCiAgICB2b2lkIG9wZXJhdG9yPSggUGVyc29uIGNvbnN0JiBvdGhlciApIHsgc2V0VmFsdWUoIG90aGVyICk7IH0KCiAgICBQZXJzb24oIHN0cmluZyBjb25zdCYgX25hbWUgKQogICAgICAgIDogbmFtZSggX25hbWUgKQogICAge30KfTsKCnN0cnVjdCBTdHVkZW50CiAgICA6IFBlcnNvbgp7CiAgICBpbnQgICAgIHN0dWRlbnRJZDsKCiAgICB2b2lkIHNldFZhbHVlKCBTdHVkZW50IGNvbnN0JiBvdGhlciApCiAgICB7CiAgICAgICAgUGVyc29uOjpzZXRWYWx1ZSggb3RoZXIgKTsgICAgICAvLyBDb3BpZXMgdGhlIG5hbWUgcGFydC4KICAgICAgICBzdHVkZW50SWQgPSBvdGhlci5zdHVkZW50SWQ7ICAgIC8vIENvcGllcyB0aGUgaWQgcGFydC4KICAgIH0KICAgIAogICAgdm9pZCBvcGVyYXRvcj0oIFN0dWRlbnQgY29uc3QmIG90aGVyICkgeyBzZXRWYWx1ZSggb3RoZXIgKTsgfQoKICAgIFN0dWRlbnQoIHN0cmluZyBjb25zdCYgX25hbWUsIGludCBjb25zdCBfc3R1ZGVudElkICkKICAgICAgICA6IFBlcnNvbiggX25hbWUgKSwgc3R1ZGVudElkKCBfc3R1ZGVudElkICkKICAgIHt9Cn07CgppbnQgbWFpbigpCnsKICAgIFBlcnNvbiAgYSggIkhpbGxhcnkgQ2xpbnRvbiIgKTsKICAgIFN0dWRlbnQgYiggIkpvaG4gU21pdGgiLCAxMjM0NSApOwoKICAgIGEgPSBiOyAgICAgICAgICAvLyBPbmx5IHRoZSBQZXJzb246Om9wZXJhdG9yPSBtYXRjaGVzIHRoZSBhcmd1bWVudHMuCiAgICAvLyBIZXJlIHRoZXJlIGlzIG5vIGBhLnN0dWRlbnRJZGAuIFRoZSBTdHVkZW50IHZhbHVlIGhhcyBiZWVuIFNMSUNFRC4KICAgIC8vIFRoZSBleGVjdXRlZCBvcGVyYXRvcj0oKSBmdW5jdGlvbiBjb3BpZXMgb25seSB0aGUgbmFtZSBhdHRyaWJ1dGUuCiAgICAKICAgIGFzc2VydCggYS5uYW1lID09IGIubmFtZSApOwp9Cg==