I have this code:
#include <iostream>
class Base {
public:
virtual void sayHello() {
std::cout << "Hello world, I am Base" << std::endl;
}
};
class Derived: public Base {
public:
void sayHello() {
std::cout << "Hello world, I am Derived" << std::endl;
}
};
void testPointer(Base *obj) {
obj->sayHello();
}
void testReference(Base &obj) {
obj.sayHello();
}
void testObject(Base obj) {
obj.sayHello();
}
int main() {
{
std::cout << "Testing with pointer argument: ";
Derived *derived = new Derived;
testPointer(derived);
}
{
std::cout << "Testing with reference argument: ";
Derived derived;
testReference(derived);
}
{
std::cout << "Testing with object argument: ";
Derived derived;
testObject(derived);
}
}
The output is:
Testing with pointer argument: Hello world, I am Derived
Testing with reference argument: Hello world, I am Derived
Testing with object argument: Hello world, I am Base
My question is why both the pointer case void testPointer(Base *obj)
and the reference case void testReference(Base &obj)
return the result of derived instance of void sayHello()
but not and the pass by copy case? What should I do to make the copy case to return the result of the derived class function void sayHello()
?