¿No hay forma de convertirse en una clase abstracta y no modificarla cada vez que una clase se deriva de ella?

#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

El compilador dice

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’

Debido a este problema, tendré que agregar funciones a la clase Abs cada vez que cree una nueva clase derivada que herede de ella (la conversión es obligatoria para mí. El programa que estoy planeando requiere que sea así). No quiero tocar la clase base una vez que se haya creado. ¿Este problema no viola el principio de que una vez que haga una clase base, no tendrá que modificarla nunca? ¿Alguna forma de resolver este problema? p.s: He visto el patrón de diseño de fábrica y los patrones de diseño del prototipo, pero parece que ambos no pueden resolverlo.

Respuestas a la pregunta(5)

Su respuesta a la pregunta