Почему мой дочерний класс не наследует строку моего родителя? - PullRequest
0 голосов
/ 09 октября 2018

Я новичок в C ++ и программировании, поэтому терпите меня: я пытаюсь сохранить строку в своем родительском классе для последующего использования в дочернем классе.Но когда я пытаюсь использовать мою строку в моем дочернем классе, она ничего не выводит.

class parent
{
protected:
    std::string str;

public:
   void input()
   {
        std::cin >> str;
   }
};

class child : parent
{
public:
   void output()
   {
        std::cout << str << std::endl;
   }
};

int main()
{
   parent parent;
   child child;

   parent.input();
   child.output();
   return 0;
}

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

class child : parent
{
public:
    void output()
    {
        std::cin >> str >> std::endl;
        std::cout << str << std::endl;
    }
};

Спасибо, что уделили время на чтение моего любительского вопроса!

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

У вас есть два отдельных экземпляра класса, а не один.A parent и child (который наследуется от parent).Два случая не связаны и не связаны;изменение одного не влияет на другое, несмотря на наследственную наследственность, которая существует.

Я думаю, вы имели в виду следующее:

int main()
{
   child obj;

   obj.input();
   obj.output();
}

Теперь, хотя input() происходит от унаследованного parentчасть объекта, вы вызываете обе функции для одного и того же объекта с одинаковым общим состоянием и должны соответственно видеть ожидаемый результат.

0 голосов
/ 10 октября 2018

Сначала записка о наследовании.Это

class child : parent

будет использовать наследование по умолчанию private.Это то же самое, что написать

class child : private parent

, и это означает, что у родителей public и protected членов будет private у ребенка, следовательно, метод input() будет недоступен извне ребенка,Код должен для этого не компилироваться, если позже вы попытаетесь вызвать метод input() на дочернем экземпляре (то есть извне).При запуске с C ++ вы почти всегда хотите сделать наследование открытым.Поэтому измените его на:

class child : public parent

или

struct child : /* public */ parent   // struct has 'public' inheritance by default

Позже вы создаете один parent и один child экземпляр.Я переименовал экземпляры p и c для ясности.Как правило, следует избегать использования того же имени для экземпляров, что и для классов.

   parent p;
   child c;

   p.input();
   c.output();

p теперь содержит (состоит из) один std::string экземпляр с именем str.c также имеет один экземпляр std::string с именем str, но это разные экземпляры / объекты (если вы не сделаете их static, но пока не делайте).Каждый экземпляр несет свои собственные данные.Даже два экземпляра одного и того же класса работают, так что это также ничего бы не повторило:

   child c1, c2;

   c1.input();
   c2.output();

Однако это будет работать, так как один и тот же экземпляр используется как для ввода, так и для вывода:

   child c;

   c.input();
   c.output();
0 голосов
/ 09 октября 2018

Поскольку std:string str находится в защищенной части parent Вы можете передать std::string str публично ИЛИ сделать это:

class parent {

public:

 void input() {

std::cin >> str;

 }

std::string str;

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