#include <iostream>
class MyClass {
public:
virtual void show(const std::string& s) const {
std::cout <<s<<": "<< "I'm a MyClass" << std::endl;
}
};
class MySubClass : public MyClass{
public:
int r=10;
void show(const std::string& s) const override {
std::cout <<s<<": "<< "I'm a MySubClass with r=" << r << std::endl;
}
};
void test_slicing() {
MySubClass xyz;
xyz.show("original object");
//... // lots of code
//... // lots of code
//... // lots of code
MyClass uvw = xyz; // forgot to replace -> slicing error !
uvw.show("wrong copy");
auto tuv = xyz; // let type inference do the job
tuv.show("right copy");
}
int main(int argc, const char * argv[]) {
test_slicing();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCmNsYXNzIE15Q2xhc3MgewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgc2hvdyhjb25zdCBzdGQ6OnN0cmluZyYgcykgY29uc3QgewogICAgICAgIHN0ZDo6Y291dCA8PHM8PCI6ICI8PCAiSSdtIGEgTXlDbGFzcyIgPDwgc3RkOjplbmRsOwogICAgfQp9OwpjbGFzcyBNeVN1YkNsYXNzIDogcHVibGljIE15Q2xhc3N7CnB1YmxpYzoKICAgIGludCByPTEwOwogICAgdm9pZCBzaG93KGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICAgc3RkOjpjb3V0IDw8czw8IjogIjw8ICJJJ20gYSBNeVN1YkNsYXNzIHdpdGggcj0iIDw8IHIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKdm9pZCB0ZXN0X3NsaWNpbmcoKSB7CiAgICBNeVN1YkNsYXNzIHh5ejsKICAgIHh5ei5zaG93KCJvcmlnaW5hbCBvYmplY3QiKTsKICAgIC8vLi4uIC8vIGxvdHMgb2YgY29kZQogICAgLy8uLi4gLy8gbG90cyBvZiBjb2RlCiAgICAvLy4uLiAvLyBsb3RzIG9mIGNvZGUKICAgIE15Q2xhc3MgdXZ3ID0geHl6OyAvLyBmb3Jnb3QgdG8gcmVwbGFjZSAtPiBzbGljaW5nIGVycm9yICEKICAgIHV2dy5zaG93KCJ3cm9uZyBjb3B5Iik7CiAgICBhdXRvIHR1diA9IHh5ejsgLy8gbGV0IHR5cGUgaW5mZXJlbmNlIGRvIHRoZSBqb2IKICAgIHR1di5zaG93KCJyaWdodCBjb3B5Iik7Cn0KCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKSB7CiAgICB0ZXN0X3NsaWNpbmcoKTsKfQ==