#include <assert.h> // assert
#include <string> // std::string
using namespace std;
struct Person
{
string name;
bool isEqualTo( Person const& other ) const
{
return (name == other.name);
}
Person( string const& _name )
: name( _name )
{}
};
bool operator==( Person const& a, Person const& b )
{ return a.Person::isEqualTo( b ); }
struct Student
: Person
{
int studentId;
bool isEqualTo( Student const& other ) const
{
return (Person::isEqualTo( other ) && studentId == other.studentId);
}
Student( string const& _name, int const _studentId )
: Person( _name ), studentId( _studentId )
{}
};
bool operator==( Student const& a, Student const& b )
{ return a.Student::isEqualTo( b ); }
int main()
{
Person a( "Hillary Clinton" );
Student b( "John Smith", 12345 );
a = b; // I once expected this assignment to NOT COMPILE!
// Here there is no `a.studentId`. The Student value has been SLICED.
assert( a == b ); // The Person class' isEqualTo still says "equal".
}
I2luY2x1ZGUgPGFzc2VydC5oPiAgICAgICAgIC8vIGFzc2VydAojaW5jbHVkZSA8c3RyaW5nPiAgICAgICAgICAgLy8gc3RkOjpzdHJpbmcKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBQZXJzb24KewogICAgc3RyaW5nICBuYW1lOwoKICAgIGJvb2wgaXNFcXVhbFRvKCBQZXJzb24gY29uc3QmIG90aGVyICkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gKG5hbWUgPT0gb3RoZXIubmFtZSk7CiAgICB9CgogICAgUGVyc29uKCBzdHJpbmcgY29uc3QmIF9uYW1lICkKICAgICAgICA6IG5hbWUoIF9uYW1lICkKICAgIHt9Cn07Cgpib29sIG9wZXJhdG9yPT0oIFBlcnNvbiBjb25zdCYgYSwgUGVyc29uIGNvbnN0JiBiICkKeyByZXR1cm4gYS5QZXJzb246OmlzRXF1YWxUbyggYiApOyB9CgpzdHJ1Y3QgU3R1ZGVudAogICAgOiBQZXJzb24KewogICAgaW50ICAgICBzdHVkZW50SWQ7CgogICAgYm9vbCBpc0VxdWFsVG8oIFN0dWRlbnQgY29uc3QmIG90aGVyICkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gKFBlcnNvbjo6aXNFcXVhbFRvKCBvdGhlciApICYmIHN0dWRlbnRJZCA9PSBvdGhlci5zdHVkZW50SWQpOwogICAgfQoKICAgIFN0dWRlbnQoIHN0cmluZyBjb25zdCYgX25hbWUsIGludCBjb25zdCBfc3R1ZGVudElkICkKICAgICAgICA6IFBlcnNvbiggX25hbWUgKSwgc3R1ZGVudElkKCBfc3R1ZGVudElkICkKICAgIHt9Cn07Cgpib29sIG9wZXJhdG9yPT0oIFN0dWRlbnQgY29uc3QmIGEsIFN0dWRlbnQgY29uc3QmIGIgKQp7IHJldHVybiBhLlN0dWRlbnQ6OmlzRXF1YWxUbyggYiApOyB9CgppbnQgbWFpbigpCnsKICAgIFBlcnNvbiAgYSggIkhpbGxhcnkgQ2xpbnRvbiIgKTsKICAgIFN0dWRlbnQgYiggIkpvaG4gU21pdGgiLCAxMjM0NSApOwogICAgCiAgICBhID0gYjsgICAgICAgICAgICAgIC8vIEkgb25jZSBleHBlY3RlZCB0aGlzIGFzc2lnbm1lbnQgdG8gTk9UIENPTVBJTEUhCiAgICAvLyBIZXJlIHRoZXJlIGlzIG5vIGBhLnN0dWRlbnRJZGAuIFRoZSBTdHVkZW50IHZhbHVlIGhhcyBiZWVuIFNMSUNFRC4KICAgIAogICAgYXNzZXJ0KCBhID09IGIgKTsgICAvLyBUaGUgUGVyc29uIGNsYXNzJyBpc0VxdWFsVG8gc3RpbGwgc2F5cyAiZXF1YWwiLgp9Cg==