コードを簡単にしようと思ったんですが、なんだか長くなりました。
こんな感じです。

class B{
public:
virtual void f() = 0;
};

class D : public B{
public:
void f(){}
};

class X : public B{
const B *b1, *b2;
public:
X(const B* c1, const B* c2):b1(c1), b2(c2){}
~X(){
delete const_cast<B*>(b1);
delete const_cast<B*>(b2);
}
};

class Y : public X{
public:
Y(const B* c1, const B* c2):X(c1, c2){}
void f(){}
};