我不熟悉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;
}
};
谢谢您阅读我的业余问题!
答案 0 :(得分:3)
您有两个单独的类实例,而不是一个。 parent
和child
(继承自parent
)。这两个实例是不相关且不相关的。尽管已有继承层次结构,但修改一个不会影响另一个。
我想你的意思是
int main()
{
child obj;
obj.input();
obj.output();
}
现在,尽管input()
来自对象的继承的parent
部分,但是您正在使用相同的共享状态在同一个对象上调用这两个函数,并且应该相应地看到预期的结果
答案 1 :(得分:1)
首先要注意继承。这个
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
的{{1}}实例(由其组成)。 str
还有一个名为c
的{{1}}实例,但是它们是不同的实例/对象(除非您将它们设置为std::string
,但现在还没有)。每个实例都携带自己的数据。即使是同一类的两个实例也可以,所以也不会重复任何内容:
str
但是,这将起作用,因为输入和输出都使用相同的实例:
static
答案 2 :(得分:-2)
因为std:string str
在parent
的受保护部分中
您可以公开转移std::string str
或执行以下操作:
class parent {
public:
void input() {
std::cin >> str;
}
std::string str;
};