C ++ полиморфизм, вызовы функций - PullRequest
3 голосов
/ 23 марта 2010

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

class SuperClass
{
public:
    int x;
}

class SubClass : public SuperClass
{
public:
    void function1()
    {
        x += 1;
    }
}

class Container
{
public:
    SuperClass * alpha;
    Container(SuperClass& beta)
    {
        alpha = beta;
    }
}

int main()
{
    Container cont = new Container(new SubClass);
}

(Я не уверен, что это правильно, я все еще очень шатаюсь по указателям. Надеюсь, это поможет понять, по крайней мере.)

Итак, я не совсем уверен, смогу ли я это сделать или нет. У меня есть скрытое подозрение, что ответ - нет, но я хочу быть уверен. Если у кого-то есть другой способ сделать что-то подобное, я буду рад это услышать.

Ответы [ 2 ]

6 голосов
/ 23 марта 2010

Определенно возможно. Несколько небольших изменений в вашем коде должны заставить это работать. Вам нужно изменить базовый класс (SuperClass), чтобы иметь виртуальный метод с той же «сигнатурой», что и у производного класса (SubClass). Вам также нужно изменить конструктор контейнера, чтобы он брал указатель на суперкласс вместо ссылки. Я считаю, что это все, что необходимо для того, чтобы заставить это работать.

РЕДАКТИРОВАТЬ: Попытка включить предложения в комментариях. Хорошие моменты. Надеюсь, я не слишком все испортил!

class SuperClass
{
public:
    int x;

    // virtual destructor ensures that the destructors of derived classes are also
    // invoked
    virtual ~SuperClass() { }

    // abstract virtual method to be overriden by derived classes
    virtual void function1() = 0;
}

class SubClass : public SuperClass
{
public:
    ~SubClass()
    {
    }

    void function1()
    {
        x += 1;
    }
}

class Container
{
public:
    SuperClass * alpha;
    Container(SuperClass* beta)
    {
        alpha = beta;
    }

    ~Container()
    {
       // Note, this will invoke the destructor of the SubClass class because 
       // SuperClass's destructor is marked as virtual.
       delete alpha;
    }
}

int main()
{
    Container* cont = new Container(new SubClass());
    delete cont;
}
0 голосов
/ 23 марта 2010

Вы должны изменить строку:

Container(SuperClass& beta)

до

Container(SuperClass* beta)

Упс, я забыл виртуальный.

...