Se CReaderBase è astratta pura sei a cavallo.
Puoi fare qualcosa del genere (in molto pseudocodice):
codice:
class CReaderBase {
	public:
		virtual ~CReaderBase() {}
		virtual funzioneA();
		virtual funzioneB();
};

class CReaderDb : public CReaderBase {
	public:
		CReaderDb(CAdoDatabase a) : cad__(a);
		virtual ~CReaderDb() {}
		virtual funzioneA() { qualcosa con cad__; }
		virtual funzioneB() { qualcosa con cad__; }
	private:
		CAdoDatabase cad__;
};

class CReaderApi  : public CReaderBase {
	public:
		CReaderApi (CSapModel  a) : csm__(a);
		virtual ~CReaderApi () {}
		virtual funzioneA() { qualcosa con csm__; }
		virtual funzioneB() { qualcosa con csm__; }
	private:
		CSapModel csm__;
};

main() {
  CReaderBase* crA = new CReaderDb(CAdoDatabase);
  CReaderBase* crB = new CReaderApi(CSapModel);
  
  crA->funzioneA();
  crA->funzioneB();

  crB->funzioneA();
  crB->funzioneB();

  delete crA;
  delete crB;
}