TestA Basic;
TestB *Advanced1 = &Basic; //Is this viable?
TestC *Advanced2 = &Basic; //And this?
Нет, ребенок не может указывать на объект типа отца.
TestB->AdvancedFunction1(); //Does this do what I think it does?
TestC->AdvancedFunction2(); //Or do implicit errors/problems occur?
Он вызывает TestB :: AdvancedFunction1 (то есть, если вы принудительно (приведение) и от Basic до Advanced1). Результаты могут быть катастрофическими.
TestB AdvVar1;
TestC AdvVar2;
AdvVar1 = Basic; //Does this do what is intended?
AdvVar2 = Basic; //Or do implicit errors occur?
Совсем нет. Хотя иногда может быть разумным понизить (бросить отца к ребенку), копирование (если не определен оператор =) не работает.
Что вы должны сделать, если вы хотите, чтобы у вас был список детей с указателями на отца, вот что вы должны сделать:
class TestA
{
public:
enum _type
{
IS_TESTA = 0,
IS_TESTB,
IS_TESTC
} type;
/* other variables */
TestA() {type = IS_TESTA;}
virtual void common_function() { /* do something with TestA data */ }
void father_function() {}
}
class TestB : public TestA
{
public:
/* variables */
TestB() {type = TestA::IS_TESTB;}
void common_function() { /* do something with TestA & TestB data */ }
void TestB_specific_function() {}
}
class TestC : public TestA
{
public:
/* variables */
TestC() {type = TestA::IS_TESTC;}
void common_function() { /* do something with TestA & TestC data */ }
void TestC_specific_function() {}
}
Чтобы создать список, вы делаете это:
TestA **list = new TestA *[size];
for (int i = 0; i < size; ++i)
if (for_any_reason_create_TestB)
list[i] = new TestB;
else if (for_any_reason_create_TestC)
list[i] = new TestC;
else
list[i] = new TestA;
Теперь, когда вы хотите использовать переменные, когда вы хотите вызвать функцию, которая используется всеми, даже если каждый подкласс реализовал ее по-своему, вы можете сделать это:
for (int i = 0; i < size; ++i)
list[i]->common_function();
И он будет автоматически вызывать TestA::common_function
, TestB::common_function
или TestC::common_function
в зависимости от типа реального объекта.
Если вы хотите вызывать определенные дочерние функции, вы можете сделать это (но не рекомендуется):
for (int i = 0; i < size; ++i)
if (list[i]->type == TestA::IS_TESTB)
((TestB *)list[i])->TestB_specific_function();
else if (list[i]->type == TestA::IS_TESTC)
((TestC *)list[i])->TestC_specific_function();