为什么我的子班不继承我父母的字符串?

时间:2018-10-09 15:39:36

标签: c++ class object

我不熟悉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 :(得分:3)

您有两个单独的类实例,而不是一个。 parentchild(继承自parent)。这两个实例是不相关且不相关的。尽管已有继承层次结构,但修改一个不会影响另一个。

我想你的意思是

int main()
{
   child obj;

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

现在,尽管input()来自对象的继承的parent部分,但是您正在使用相同的共享状态在同一个对象上调用这两个函数,并且应该相应地看到预期的结果

答案 1 :(得分:1)

首先要注意继承。这个

class child : parent

将使用默认的private继承。和写作一样

class child : private parent

,这意味着父母publicprotected成员将是孩子中的private,因此input()方法将无法从孩子外部使用。如果您稍后尝试在子实例上(即从外部)调用input()方法,则代码应该无法编译。从C ++开始时,您几乎总是想公开继承。因此将其更改为:

class child : public parent

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

稍后,您将创建一个parent和一个child实例。为了清楚起见,我将实例pc重命名。通常应该避免在实例上使用与类相同的名称。

   parent p;
   child c;

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

p现在包含一个名为std::string的{​​{1}}实例(由其组成)。 str还有一个名为c的{​​{1}}实例,但是它们是不同的实例/对象(除非您将它们设置为std::string,但现在还没有)。每个实例都携带自己的数据。即使是同一类的两个实例也可以,所以也不会重复任何内容:

str

但是,这将起作用,因为输入和输出都使用相同的实例:

static

答案 2 :(得分:-2)

因为std:string strparent的受保护部分中 您可以公开转移std::string str或执行以下操作:

class parent {

public:

 void input() {

std::cin >> str;

 }

std::string str;

};