Nevím, zda jsem tě dobře pochopil, ale např. takto je jedno možnost:
#include <iostream>
using namespace std;
class X;
class B
{
int valueB;
X* ptrX;
public:
B() : valueB(20), ptrX(0) { }
int ValueB() const { return valueB; }
void setPtrX(X* ptr) { ptrX = ptr; }
X* PtrX() { return ptrX; }
};
class A
{
int valueA;
B* ptrB;
public:
A() : valueA(10) { ptrB = new B(); }
int ValueA() const { return valueA; }
B* PtrB() { return ptrB; }
class X
{
int valueX;
public:
X() : valueX(50) { }
int ValueX() const { return valueX; }
};
};
int main()
{
A a;
cout << a.ValueA(); // 10
cout << a.PtrB()->ValueB(); // 20
A::X x;
cout << x.ValueX(); // 50
B b;
b.setPtrX(&(X&)x);
cout << x.ValueX(); // 50
return 0;
}
On je hlavně problém, pokud máš sub-classu ve třídě A a chces mít ukazatel na sub-class ve třídě B, tak je nutný to přetypoval, protože typ je A::X a né jenom X.. tady nastavá ten problém, že nelze použít konstruktor bez přetypování (nebo aspoň neznám jinej způsob)
Jinak ještě jeden příklad vypisu:
A a;
cout << a.ValueA(); // 10
cout << a.PtrB()->ValueB(); // 20
// alokuje pamet sub-tridy X ve tride A do tridy B
a.PtrB()->setPtrX((X*)new A::X());
cout << ((A::X*)a.PtrB()->PtrX())->ValueX(); // 50