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

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

Даже путем добавления к производному его собственного конструктора по умолчанию и того же int x, y;переменных, с различными значениями по умолчанию, метод выводит значения по умолчанию для базового класса. Почему это происходит, и как я могу избежать этого? Я знаю о защищенных членах, но все же, что здесь происходит? Я сначала попробовал это с производным классом пустым (без конструктора и переменных), и результат тот же. Как можно использовать переменные, которые не наследуются?

class base {
private:
    int x, y;

public:
    base(int px=1, int py=2)
        :x(px), y(py)
    {}

    inline void print() const {
        cout << x << ", " << y << '\n';
    }
};

class derived : public base {
private:
    int x, y;
public:
    derived(int px = 3, int py = 3)
        :x(px), y(py)
    {}
};

int main{
        derived e;
        e.print(); // prints 1, 2
}

1 Ответ

0 голосов
/ 27 октября 2019

base::print не может видеть переменные-члены в derived. У вас есть несколько вариантов:

  1. Используйте protected, если вы действительно хотите, чтобы base::x и derived::x отличались.
  2. Передайте px и py в *Конструктор 1013 *: derived(int px = 3, int py = 3) : base(px, py) { }
  3. Создайте base::print virtual функцию-член и переопределите ее в derived.

Какой вариант лучше всего зависит от ваших требований.

...