0

在以后的程序中,我有一个类 animal,它派生了 cat 和 dog 具有相同的公共函数但不同的私有函数。我想让用户在运行时决定创建哪种动物。我做了一个简单的例子,展示了我大致想要的东西,但显然不起作用。我不知道如何解决这个问题,希望得到你的帮助。

#include <cstdio>

class canimal
{
  public:
    int sound()
    {
      std::printf("...\n");
      return 0;
    }
};

class cdog : public canimal
{
  public:
    int sound()
    {
      std::printf("Woof!\n");
      return 0;
    }
};

class ccat : public canimal
{
  public:
    int sound()
    {
      std::printf("Mieau!\n");
      return 0;
    }
};

int main()
{
  canimal *animal;
  cdog    *dog;

  // I would like to let the user decide here which animal will be made
  // In this case, I would like the function to say "Woof!", but of course it doesn't...
  animal = new cdog;
  animal->sound();

  // Here it works, but I would like the pointer to be of the generic class
  // such that the type of animal can be chosen at runtime
  dog    = new cdog;
  dog->sound();

  return 0;
}
4

3 回答 3

3

您需要制作sound()方法virtual

class canimal
{
  public:
    virtual int sound()
    ^^^^^^^

这将使它完全按照您的需要运行。

如需进一步讨论,请参阅为什么我们需要 C++ 中的虚拟函数?

在 C++ 11 中有一个新override关键字,如果使用得当,可以减少某些类型的错误。请参阅安全覆盖 C++ 虚函数

于 2013-03-12T09:21:51.910 回答
1

你需要使用virtual

IE

class canimal
{
  public:
    virtual int sound()
    {
      std::printf("...\n");
      return 0;
    }
};

class cdog : public canimal
{
  public:
    virtual int sound()
    {
      std::printf("Woof!\n");
      return 0;
    }
};

class ccat : public canimal
{
  public:
    virtual int sound()
    {
      std::printf("Mieau!\n");
      return 0;
    }
};
于 2013-03-12T09:23:09.373 回答
1

我认为您正在寻求使 sound() 虚拟化。阅读 C++ 中的多态性。

class canimal
{
  public:
    virtual int sound()
    {
      std::printf("...\n");
      return 0;
    }
};
于 2013-03-12T09:22:10.500 回答