c ++继承:在子类中使用父方法

时间:2014-01-01 18:10:02

标签: c++ inheritance

我是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的方法?

3 个答案:

答案 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中你有两个字符串成员:

  1. Unit::test(如果您在test范围内,则只需Unit
  2. Human::test(如果您在test范围内,则只需Human
  3. 由于您从单位范围getString调用了父方法,因此仅查看Unit范围。

    类的行为就像命名空间一样。

    您可以在c ++中执行此操作,因为这两个变量在不同的名称空间或作用域中声明。

    就像你可以在不同的范围内声明具有相同名称的变量一样:

    int i=0;
    {
     int i=1;
     cout<<i; //will print the last = 1
    }
    cout<<i; //will print the first = 0