Eso no es herencia:
En el ejemplo que pongo se ve cómo se pueden comunicar clases sin necesidad de herencia.
#include <iostream>
#include <string>
class B;
class A
{
friend class B;
public:
A( )
: b( nullptr )
{ }
void SetB( B* ptr_b )
{ b = ptr_b; }
void EnviarMensaje( const std::string& mensaje ) const;
private:
B* b;
void PonerMensaje( const std::string& mensaje ) const
{ std::cout << "A: " << mensaje << std::endl; }
};
class B
{
friend class A;
public:
B( )
: a( nullptr )
{ }
void SetA( A* ptr_a )
{ a = ptr_a; }
void EnviarMensaje( const std::string& mensaje ) const
{ if ( a ) a->PonerMensaje( mensaje ); }
private:
A* a;
void PonerMensaje( const std::string& mensaje ) const
{ std::cout << "B: " << mensaje << std::endl; }
};
void A::EnviarMensaje( const std::string& mensaje ) const
{ if ( b ) b->PonerMensaje( mensaje ); }
int main( )
{
A a;
B b;
a.SetB( &b );
b.SetA( &a );
a.EnviarMensaje( "Hola" ); // Pantalla: B: Hola
b.EnviarMensaje( "Adios" ); // Pantalla: A: Adios
}
Deberías aclarar un poco más los requisitos