Проблема полиморфизма C ++ - PullRequest
0 голосов
/ 13 мая 2011

У меня есть эти классы:

class A
{
};

class B : public A
{
public:
    B(int val);
private:
    int* m_int;
};

B::B(int val)
{
    m_int = &val;
}

Я вызываю код примерно так: внутри 1-й функции я знаю, что переменные будут уничтожены, как только они выйдут из области видимости, но они нужны мне только в этой функции:

{
...
int _int = 0;
B obj(_int);
A *obj2 = &obj;
_int++;
...
}

Проблема в том, что _int меняется на 1, но m_int остается прежним.Мне нужно, чтобы m_int отражал значение _int без необходимости обновлять его кодом.Я думал, что с указателем на ячейку памяти будет работать?

Вторая проблема заключается в том, что когда я наводю указатель мыши на obj2, чтобы увидеть значения obj, я получаю сообщение «дети не могут быть оценены».

Ответы [ 3 ]

3 голосов
/ 13 мая 2011

Я не слишком уверен, что следующий совет - хороший совет для новичка, но использование такой ссылки сработало бы:

class B : A
{
public:
    explicit B(int& val);
private:
    int* m_int;
};

B::B(int& val)
{
    m_int = &val;
}

Я немного волнуюсь, что это на самом деле признакплохой дизайн.Если это только для целей обучения, продолжайте, понимание всегда важно

1 голос
/ 13 мая 2011

Указатель m_int останется прежним, но значение , указанное на *m_int, изменится, вам также придется передать значение val со ссылкой на функцию.

РЕДАКТИРОВАНИЕ: Увидел отредактированный вопрос, поскольку это делается из конструктора, который вы можете сделать:

class B : A
{
public:
    B(int& val) : m_int(val) {}
private:
    int& m_int;
};

Чтобы m_int ссылался на ту же переменную.

0 голосов
/ 13 мая 2011

Если вы хотите изменить значение _int, вы должны передать его указатель, то, что вы сейчас делаете, это вызов по значению.

B::B(int* val)
{
    m_int = val; // not ref
}

, а m_int должен иметь тип int*, а не int

Для второй проблемы, вы храните значение производного класса в указателе на base, поэтому, когда вы пытаетесь увидеть, что находится внутри obj2, вы видите только часть типа base, поэтому вы получаете дочерние сообщенияне может быть оценена.
Edit -
Если вы хотите увидеть, что на самом деле находится в obj2, вы должны снова привести его к производному типу.И вы не всегда можете знать, что во время выполнения ...

...