Não há como fazer upcast em uma classe abstrata e não modificá-la toda vez que uma classe é derivada dela?

#include<iostream>
using namespace std;

class Abs
{
        public:
        virtual void hi()=0;
};

class B:public Abs
{
        public:
        void hi() {cout<<"B Hi"<<endl;}
        void bye() {cout<<"B Bye"<<endl;}
};
class C:public Abs
{
        public:
        void hi() {cout<<"C Hi"<<endl;}
        void sayonara() {cout<<"C Sayonara"<<endl;}
};

int main()
{
        Abs *bb=new B;
        bb->bye();
        Abs *cc=new C;
        cc->sayonara();
}//main

O compilador diz

test2.cpp: In function ‘int main()’:
test2.cpp:26: error: ‘class Abs’ has no member named ‘bye’
test2.cpp:28: error: ‘class Abs’ has no member named ‘sayonara’

Devido a esse problema, terei que adicionar funções à classe Abs sempre que criar uma nova classe derivada que a herda (o Upcasting é obrigatório para mim. O programa que estou planejando exige que seja). Não quero tocar na classe base depois que ela for criada. Esse problema não viola o princípio de que, depois de criar uma classe base, você nunca precisará modificá-la. Alguma maneira de resolver esse problema? p.s: vi o padrão de design da fábrica e o protótipo, mas os dois parecem incapazes de resolvê-lo.

questionAnswers(5)

yourAnswerToTheQuestion