Скажем, у меня есть два класса:
class A
{
    public:
    A* Hello()
    {
        return this;
    }
}
class B:public class A
{
    public:
    B* World()
    {
        return this;
    }
}
И пусть скажем, что у меня есть экземпляр класса B:
B test;
Если я вызываю test.World()->Hello(), это будет работать нормально.
Но test.Hello()->World() не будет работать, поскольку Hello() возвращает A тип.
Как я могу сделать Hello() вернуть тип B? Я не хочу использовать функцию virtual, так как у нас есть более 20 разных классов, наследующих A.