我是c ++的新手,所以我希望这个问题不是太愚蠢。
我希望在我的父类中有一个可以继承的方法,并且可以在子类中使用,所以我总是可以在任何地方使用相同的功能。
我遇到以下代码的问题:
#include <iostream>
using namespace std;
class Unit {
public:
string test = "Unit string";
virtual void getString();
};
class Human: public Unit {
public:
string test = "Human string";
void getScString();
};
void Unit::getString()
{
cout << "output:" << test;
}
void Human::getScString()
{
cout << "output:" << test;
}
int main()
{
Human tom = Human();
tom.getString(); // output:Unit string
tom.getScString(); // output:Human string
return 0;
}
为什么tom.getString()不执行“输出:人类字符串”?
我是否真的必须在每个子类中实现类似getScString的方法?
答案 0 :(得分:1)
您没有重写getString()
,因此正在调用基类方法,该方法将使用基类中的test
。
答案 1 :(得分:0)
string Human::test
阴影字符串Unit::test
。
您可以使用以下内容:
class Unit {
public:
string test = "Unit string";
void displayString() { std::cout << test << std::endl; }
};
class Human: public Unit {
public:
Unit() { test = "Human string"; };
};
或
class Unit {
public:
virtual string getString() const { return "Unit string"; }
void displayString() { std::cout << test << std::endl; }
};
class Human: public Unit {
public:
string getString() const override { return "Human string"; }
};
答案 2 :(得分:0)
在子类Human中你有两个字符串成员:
Unit::test
(如果您在test
范围内,则只需Unit
)Human::test
(如果您在test
范围内,则只需Human
)由于您从单位范围getString
调用了父方法,因此仅查看Unit
范围。
类的行为就像命名空间一样。
您可以在c ++中执行此操作,因为这两个变量在不同的名称空间或作用域中声明。
就像你可以在不同的范围内声明具有相同名称的变量一样:
int i=0;
{
int i=1;
cout<<i; //will print the last = 1
}
cout<<i; //will print the first = 0