Как вызвать функцию перегрузки дочернего объекта при полиморфизме? - PullRequest
2 голосов
/ 14 октября 2010

Рассмотрим следующий простой полиморфизм ...

class Parent {
public:
    someFunc() { /* implementation A */ };
};

class Child : public Parent {
public:
    someFunc() { /* implementation B */ };
};

int main ()
{
    Parent* ptr;

    ptr = new Parent();
    ptr->someFunc();
    delete ptr;

    ptr = new Child();
    ptr->someFunc();
    delete ptr;

    return 0;
}

Насколько я могу судить, в обоих случаях будет вызываться реализация A.

Как я могу вызвать«самая производная» реализация someFunc, в зависимости от динамического типа ptr?

В моем реальном коде есть много дочерних типов, поэтому было бы непрактично использовать dynamic_cast для проверки каждого дочернего класса.

Ответы [ 3 ]

4 голосов
/ 14 октября 2010

Попробуйте:

class Parent 
{
    public:
         virtual someFunc() { /* implementation A */ };
       //^^^^^^^
};

Хотя технически это не требуется.
Я всегда считаю хорошим стилем объявление виртуальной производной функции:

class Child : public Parent 
{
    public:
        virtual someFunc() { /* implementation B */ };
};

В отличие от функций Java,виртуальный по умолчанию.

3 голосов
/ 14 октября 2010

Объявить someFunc Виртуальный. Это обеспечит вызов реализации фактического объекта, а не реализации в зависимости от типа указателя.

Это, однако, добавит некоторые накладные расходы, связанные с созданием VTABLE и более медленным вызовом виртуальной функции, но по сути это полиморфизм.

2 голосов
/ 14 октября 2010

Здесь нет полиморфизма! Ни одна из ваших функций не virtual.

Если вы хотите полиморфизм, сделайте это:

class Parent {
public:
    virtual someFunc() { /* implementation A */ };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...