Если класс является полиморфным (то есть содержит хотя бы одну виртуальную функцию), то вы можете проверить, указывает ли указатель на базу конкретного экземпляра производного класса, используя динамическое приведение. Пример:
struct X {
virtual ~X() = default;
};
struct Y : X {};
struct Z : X {};
int main() {
Y y;
X* x = &y;
if (Y* y = dynamic_cast<Y*>(x))
; // x indeed does point to (a base of) Y instance
// and y now points to that Y instance
if (Z* z = dynamic_cast<Z*>(x))
; // this is never reached, since x doesn't point to a base of Z
}
Не имеет значения, является ли указатель элементом массива.
В противном случае (т. Е. Если класс не является полиморфным), указатель на базу одного класса неотличим от указателя на базу (того же типа) другого класса, и, таким образом, в этом случае такая проверка невозможна в генеральный. Вы можете реализовать это, сохранив информацию о типе производного типа в элементе базы, но это может быть сложным и, вероятно, бесполезным.
PS.
class B : A {
B ob;
};
Класс не может иметь себя в качестве члена.