Нет, невозможно переслать объявление наследования, даже если вы имеете дело только с указателями. При работе с преобразованиями между указателями иногда компилятор должен знать детали класса, чтобы выполнить преобразование правильно. Это случай множественного наследования. (Вы могли бы в особом случае выделить некоторые части иерархической структуры, которые используют только одиночное наследование, но это не является частью языка.)
Рассмотрим следующий тривиальный случай:
#include <stdio.h>
class A { int x; };
class B { int y; };
class C: public A, public B { int z; };
void main()
{
C c; A *pa = &c; B *pb = &c; C *pc = &c;
printf("A: %p, B: %p, C: %p\n", pa, pb, pc);
}
Вывод, который я получил (используя 32-битную Visual Studio 2010):
A: 0018F748, B: 0018F74C, C: 0018F748
Таким образом, для множественного наследования при преобразовании между связанными указателями компилятор должен вставить некоторую арифметику указателей, чтобы получить правильные преобразования.
Вот почему, даже если вы имеете дело только с указателями, вы не можете пересылать объявление наследования.
Что касается того, почему это было бы полезно, это улучшило бы время компиляции, когда вы хотите использовать ко-вариантные типы возврата вместо использования приведения. Например, это не скомпилируется:
class RA;
class A { public: virtual RA *fooRet(); };
class RB;
class B : public A { public: virtual RB *fooRet(); };
Но это будет:
class RA;
class A { public: virtual RA *fooRet(); };
class RA { int x; };
class RB : public RA{ int y; };
class B : public A { public: virtual RB *fooRet(); };
Это полезно, когда у вас есть объекты типа B (не указатели или ссылки). В этом случае компилятор достаточно умен, чтобы использовать прямой вызов функции, и вы можете использовать возвращаемый тип RB * напрямую, без приведения. В этом случае обычно я делаю тип возврата RA * и выполняю статическое приведение возвращаемого значения.