#include <iostream>
using std::cout;
using std::endl;
class Base
{
public:
int x;
Base() : x(42)
{
}
virtual void PrintSomething()
{
cout << "Base::PrintSomething x=" << x << endl;
}
};
class Derived : public Base
{
public:
int y;
Derived() : y(-1)
{
x = 0;
}
virtual void PrintSomething()
{
cout << "Derived::PrintSomething x=" << x << " y=" << y << endl;
}
};
int main (int argc, char *argv[])
{
Base bValue;
Derived dValue;
bValue.PrintSomething();
dValue.PrintSomething();
Base *bPointer1 = &bValue;
Base *bPointer2 = &dValue;
// call PrintSomething virtually
bPointer1->PrintSomething();
bPointer2->PrintSomething();
Base bCopy1 = bValue;
Base bCopy2 = dValue; // dValue is sliced
// call PrintSomething non-virtually
bCopy1.PrintSomething();
bCopy2.PrintSomething();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgc3RkOjpjb3V0Owp1c2luZyBzdGQ6OmVuZGw7CgpjbGFzcyBCYXNlCnsKICAgIHB1YmxpYzoKICAgICAgICBpbnQgeDsKICAgICAgICAKICAgICAgICBCYXNlKCkgOiB4KDQyKQogICAgICAgIHsKICAgICAgICB9CiAKICAgICAgICB2aXJ0dWFsIHZvaWQgUHJpbnRTb21ldGhpbmcoKQogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCAiQmFzZTo6UHJpbnRTb21ldGhpbmcgeD0iIDw8IHggPDwgZW5kbDsKICAgICAgICB9Cn07CiAKY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlCnsKICAgIHB1YmxpYzoKICAgICAgICBpbnQgeTsKIAogICAgICAgIERlcml2ZWQoKSA6IHkoLTEpCiAgICAgICAgewogICAgICAgICAgICB4ID0gMDsKICAgICAgICB9CgogICAgICAgIHZpcnR1YWwgdm9pZCBQcmludFNvbWV0aGluZygpCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICJEZXJpdmVkOjpQcmludFNvbWV0aGluZyB4PSIgPDwgeCA8PCAiIHk9IiA8PCB5IDw8IGVuZGw7CiAgICAgICAgfQp9OwogCmludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgICBCYXNlIGJWYWx1ZTsKICAgIERlcml2ZWQgZFZhbHVlOwoKICAgIGJWYWx1ZS5QcmludFNvbWV0aGluZygpOwogICAgZFZhbHVlLlByaW50U29tZXRoaW5nKCk7CgogICAgQmFzZSAqYlBvaW50ZXIxID0gJmJWYWx1ZTsKICAgIEJhc2UgKmJQb2ludGVyMiA9ICZkVmFsdWU7CgogICAgLy8gY2FsbCBQcmludFNvbWV0aGluZyB2aXJ0dWFsbHkKICAgIGJQb2ludGVyMS0+UHJpbnRTb21ldGhpbmcoKTsKICAgIGJQb2ludGVyMi0+UHJpbnRTb21ldGhpbmcoKTsKCiAgICBCYXNlIGJDb3B5MSA9IGJWYWx1ZTsKICAgIEJhc2UgYkNvcHkyID0gZFZhbHVlOyAgIC8vIGRWYWx1ZSBpcyBzbGljZWQKCiAgICAvLyBjYWxsIFByaW50U29tZXRoaW5nIG5vbi12aXJ0dWFsbHkKICAgIGJDb3B5MS5QcmludFNvbWV0aGluZygpOwogICAgYkNvcHkyLlByaW50U29tZXRoaW5nKCk7CgogICAgcmV0dXJuIDA7Cn0=