Неожиданный вывод унаследованной функции-члена - PullRequest
0 голосов
/ 08 ноября 2019

Рассмотрим следующий код:

#include <list>
#include <iostream>

class test{
    private:
        std::list<double> lst;

    public:
        int get_size(){
            return lst.size();
        }
};

class derived : public test{
    private:
        std::list<double> lst;

    public:
        derived(int u=8){
            for (int k =0 ; k < u; ++k){
                int n = lst.size();
                lst.push_back(0);
            }
        }
};

int main(){

    derived obj = derived();

    std::cout << obj.get_size() << "\n";
    return 0;
}

Я пытаюсь понять, почему вывод вышеприведенного кода не 8. Я думал, что идея наследования позволяет использовать функции-члены базового класса в производном классе, но кажется, что это не работает. Конечно, я мог бы сделать get_size функцию virtual в базовом классе, а затем скопировать, вставить код в производный класс и добавить override, но это кажется действительно странным, поскольку в этом случае я мог бы просто повторно реализоватьфункционировать в любом случае ... Так может кто-нибудь объяснить, как мы должны изменить код сверху, чтобы получить вывод 8?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Вы не используете list из test. Вы объявляете новый list и вместо этого используете его в своем конструкторе для derived.

С другой стороны, size() использует list из test.

Если вы хотите добавить к test list изнутри derived, вы должны сделать список test protected, а не личным. И вы должны удалить list с повторяющимся именем из derived.

1 голос
/ 08 ноября 2019

lst в вашем derived классе отличается от того, что используется в вашем базовом классе.

Вы должны сделать lst protected вместо private в вашем testБазовый класс. Затем вы можете использовать ту же переменную в производном классе. Конечно, вам также необходимо удалить объявление lst в вашем производном классе.

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