c ++从超类中的子类调用方法

c++ calling method from subclass in superclass

我对 C++ 对象编程有点陌生,需要一点帮助。

假设我有 class 只动物和子 class 只猫。 在主程序中,我创建了一个指向 Animal 的指针数组,如下所示:

Animal* array[10];
array[0] = new Cat();

Subclass cat 有他自己的整数,方法 getType 到 return 那个整数。我想知道如何调用这个方法。

我试过了:

array[0]->getType()

但是它说,无法解析该方法,并且 classAnimal 没有名为 getType 的成员。 我也试过使这个方法虚拟化,但仍然没有用。 有什么解决办法吗?

此致

如果我没记错的话,您需要将数组[0] 转换为 Cat 类型。所以它会像这样

dynamic_cast<Cat>(array[0])->getType();

这是我的第一个 post,我还没有尝试过我的建议,所以如果这是错误的,我深表歉意。

您需要 Cat * 才能调用 getType()。在 C++ 中,使用 casting operators.

转换(转换)指针

如果您确定(在较大的程序中这会反咬一口)您的 array[0] 确实指向 class Cat 的对象,您可以使用(参见 ideone 完整程序)

Cat * catPtr = static_cast<Cat *>(array[0]);
catPtr->getType();

或者,简而言之,

static_cast<Cat *>(array[0])->getType();

请注意,如果 array[0] 不是指向 Cat 的指针,这将失败得很惨。


只要您的 classes 是多态的(包含虚拟成员),在您的情况下(基本 class 指针数组和 运行 派生方法)应该是在这种情况下,您可以使用 dynamic_cast 而不是 static_cast。它会产生运行时开销,但会检查转换是否有效,如果无效则 return nullptr

您需要在基class中将其声明为虚函数,示例:

virtual void getType() { cout << "Animal" << '\n'; }

并且在派生的 class 中您可以覆盖它:

void getType() override { cout << "Cat" << '\n'; }

现在您可以调用 array[0]->getType(),它将使用覆盖的 Cat::getType()

在我看来你想要 Animal 的多个子classes,它们将具有相同的方法并且你将使用 Animal * 的数组来调用子classes 的方法。如果是这种情况,那么你应该制作 Animal class 方法 virtual:

  1. Animal class
  2. 中声明所有方法(您希望所有子class 拥有)
  3. 如果他们有 "default" 实施,请将其放入 Animal
  4. 否则,在 Animal 中将它们设为纯虚拟(参见示例)
  5. 在 subclasses 中,覆盖纯虚拟方法以及那些将具有非默认实现的方法

所以你的 Animal class 应该是这样的:

class Animal {
    public:
        virtual int getType() = 0; // purely virtual function
};

和您的 Cat class 应该覆盖这些方法(请注意 override 标识符不是必需的,尽管推荐

class Cat : public Animal {
    public:
        int getType() override {
            return 42;
        }
};

这允许

Animal * array[10];
array[0] = new Cat();
std::cout << array[0]->getType() << std::endl;

这将打印 42。参见 ideone example