/*
* main.cc
*
* Created on: 2008-8-5
* Author: Administrator
*/
#include <iostream>
class Base
{
public:
virtual Base *clone(){ std::cout << "Base::clone() \n"; return new Base;}
};
class Derived : public Base
{
public:
Derived *clone(){ std::cout << "Derived::clone() \n"; return new Derived;}
};
int main(int arg, char **args)
{
Derived *pd = new Derived;
pd->clone();
Base *pb = pd;
pb->clone();
return 0;
}
Result:
Derived: Clone ()
Derived: Clone ()
We can see that although the return types are not exactly the same, the return value in the parent class is a pointer or reference. When the subclass override, we can return the derivation of this pointer (or reference). In this case, override succeeded.
Let's look at the following example:
#include <iostream>
class Base
{
public:
virtual Base *clone(){ std::cout << "Base::clone() \n"; return new Base;}
virtual void copy(Base&){ std::cout << "Base::copy() \n"; }
};
class Derived : public Base
{
public:
Derived *clone(){ std::cout << "Derived::clone() \n"; return new Derived;}
void copy(Derived&) { std::cout << "Derived::copy() \n"; }
};
int main(int arg, char **args)
{
Derived d;
Base b;
Derived *pd = new Derived;
pd->copy(d);
Base *pb = pd;
pb->copy(b);
return 0;
}
Result:
Derived: Copy ()
Base: Copy ()
In this case, override does not occur, and hide does.
Set
void copy(Derived&) { std::cout << "Derived::copy() \n"; }
Changed:
void copy(Base&) { std::cout << "Derived::copy() \n"; }
Override is successful!