0

这是一个特定的问题,我已经有一段时间找不到解决方案了。我有这个代码:

#include <iostream>

using namespace std;

class Mammal
{
  public:
  Mammal() {cout << "Mammal Constructor\n";}
  virtual ~Mammal() {cout << "Mammal Destructor\n";}
  virtual void Run() {cout << "Mammal Ran One Space\n";}

  protected:
  int mammalDistance;
};

class Horse : public Mammal
{
    public:
    Horse() {cout << "Horse Constructor\n";}
    ~Horse() {cout << "Horse Destructor\n";}
    void Run() {cout << "Horse Ran One Space\n";}
    void Run(int distance) {horseDistance = distance;
                            cout << "Horse Ran " << horseDistance << " Spaces\n";}

    protected:
    int horseDistance;
};

int main()
{
    Mammal *pHorse = new Horse;
    pHorse->Run(5);
    delete pHorse;
    return 0;
}

现在,如果我使用 void Run(int horseDistance) 并将其向上移动到 Mammal 中,则此代码有效,但我想知道是否有办法将其保留在马中而不保持隐藏。

编辑:我的意思是,如果我采用接受输入的函数并将其向上移动到 Mammal 中,而不是像现在这样将它放在 Horse 类中,它会按预期编译和工作。是的,如果它可以在传入 horseDistance 时改变它的值,我希望它。编辑:OI 明白你的意思。我编辑了代码。

4

4 回答 4

1
Mammal *pHorse = new Horse;
pHorse->Run(5);

不起作用,因为 Mammal 中没有带有签名的成员函数void Run(int)。更准确地说:void Run(int)Horse 类中给出的函数不是void Run()Mammal 中函数的覆盖,因为不同的签名。

您应该考虑添加void Run(int)到 Mammal 接口,如果它是更多子类将实现的函数。

于 2012-08-25T20:40:28.110 回答
1

你有两个选择。一个是跟踪您的指针是马的事实:

int main()
{
    Horse *pHorse = new Horse;
    pHorse->Run(5);
    delete pHorse;
    return 0;
}

另一种是在中声明一个虚函数Mammal

virtual void Run(int mammalDistance) = 0;

如果马是唯一跑特定距离的东西,我会选择选项#1,否则选择选项#2。

于 2012-08-25T20:40:47.807 回答
0

现在您知道 pHorse 是一匹马,但是对于编译器来说,它是不同的。唯一的方法是使用动态转换检查 pHorse 是否为马,然后将其转换为 Horse* 并转换 Run(5) 方法。

Horse* pHorse2=dynamic_cast<Horse*>(pHorse);
if(pHorse2!=NULL){
   pHorse2->Run(5);
}else{
   pHorse->Run();
}
于 2012-08-25T20:37:46.147 回答
0

我认为您在这里寻找多态性。您的所有派生Mammals都必须实现getDistance()setDistance()并且还可以实现getAnimal()以提供名称。我认为在设计上仍有一些改进的空间,但你会通过这种方式掌握多态性的窍门。可能是这样的:

#include <iostream>

using namespace std;

class Mammal
{
public:
  Mammal() {cout << "Mammal Constructor\n";}
  virtual ~Mammal() {cout << "Mammal Destructor\n";}
  virtual void Run() {cout << getAnimal() << " Ran " << getDistance() << " Space\n";}
  virtual void Run(int p_distance)
  {setDistance(p_distance);
    cout << getAnimal() << " Ran " << getDistance() << " Spaces\n";}

protected:
  virtual void setDistance(int p_distance) {mammalDistance = p_distance;}
  virtual int getDistance() {return mammalDistance;}
  virtual string getAnimal() {return "Mammal";}
  int mammalDistance;
};

class Horse : public Mammal
{
public:
    Horse() {cout << "Horse Constructor\n";}
    ~Horse() {cout << "Horse Destructor\n";}
protected:
    int horseDistance;
    virtual string getAnimal() {return "Horse";}
};

int main()
{
    Mammal *pHorse = new Horse;
    pHorse->Run(5);
    delete pHorse;
    return 0;
}
于 2012-08-25T20:52:23.543 回答