Получить дополнительную функцию из базового класса - PullRequest
0 голосов
/ 05 июля 2019

Я относительно новичок в C ++. У нас есть абстрактный базовый класс и 2 производных класса.

class PositionBase  (abstract)
class PositionLenght: PositionBase
class PositionAngle:  PositionBase

PositionBase содержит такие функции, как получение имени. Производные классы имеют такие методы, как GetLenght() или GetAngle();

(Старое) приложение содержит массив, который содержит производные классы.

Предположим, я получаю объект из array[1] и, основываясь на его типе, я хочу запустить GetLength() or GetAngle(). Затем мне нужно знать тип объекта, который я получаю из массива.

Когда я использую:

 if(PositionBase->IsKindOf(RUNTIME_CLASS(PositionLenght))))
        {do something}   

это не работает. Что работает

if(typeid(*PositionBase) == typeid(PositionLenght)))
    {do something}

Я также могу просто "dynamic_cast" объект, и если он не возвращает NULL, я в порядке.

В C# Я бы использовал интерфейсы, какой предпочтительный способ справиться с этим в C++?

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Точно так же (как в C #). Вы определяете виртуальную функцию в базовом классе и заменяете ее необходимой функциональностью в производных классах:

class PositionBase {
public:
    virtual void do_something() = 0;
};
class PositionLenght: public PositionBase {
    void do_something() override {
        std::cout << "doing something for length\n";
    }
};
class PositionAngle: public PositionBase {
    void do_something() override {
        std::cout << "doing something for angle\n";
    }
};
int main() {
    PositionBase *arr[] = {
        new PositionLenght(),
        new PositionAngle(),
    };
    for(auto i = 0; i < 2; ++i) arr[i]->do_something();
}

напечатает:

doing something for length
doing something for angle
0 голосов
/ 05 июля 2019

Если я хорошо понимаю, вам нужно:

В C ++ вы можете хранить указатели на производный класс в массиве указателей на базовый (абстрактный) класс. Оттуда, когда вы получаете указатель на базу из массива, Если вам нужна конкретная функция из производного класса, чем вам нужно используйте dynamic_cast для приведения к производному от базы и проверки результата, чтобы увидеть, успешно ли приведено и если вы можете вызвать функцию, которую вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...