从超类

时间:2016-04-17 08:45:18

标签: inheritance methods subclass

我对c ++对象编程有点新意,需要一些帮助。

让我们说我有类Animal和子类cat。 在主程序中,我创建了一个指向Animal的指针数组,如下所示:

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

子类cat有自己的整数,方法getType返回该整数。我想知道如何称呼这种方法。

我试过了:

array[0]->getType()

但它说,该方法无法解决,而且Animal类没有名为getType的成员。 我也试图让这个方法变得虚拟,但仍然没有用。 任何解决方案?

此致

4 个答案:

答案 0 :(得分:1)

您需要在基类中将其声明为虚拟,例如:

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

在派生类中,您可以覆盖它:

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

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

答案 1 :(得分:0)

在我看来,你想要有几个Animal的子类,这些子类将具有相同的方法,并且你将使用Animal *数组来调用子类的方法。如果是这种情况,那么您应该Animal类方法virtual

  1. Animal class
  2. 中声明所有方法(您希望所有子类都有)
  3. 如果他们有“默认”实施,请将其放在Animal
  4. 否则,请在Animal(见示例)
  5. 中将它们视为纯虚拟
  6. 在子类中,覆盖纯虚方法以及具有非默认实现的方法
  7. 所以你的Animal课应该是这样的:

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

    并且您的Cat类应覆盖这些方法(请注意,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

答案 2 :(得分:-1)

如果我没记错,你需要将数组[0]转换为Cat类型。所以就像这样

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

这是我的第一篇文章,我没有尝试过我的建议,所以如果这是错误的话我道歉。

答案 3 :(得分:-2)

您需要 //Contact with bullet func contactWithBullet(enemy : SKSpriteNode, bullet: SKSpriteNode) { enemy.removeFromParent() bullet.removeFromParent() score += 1 updateLabels() } //contact with player func contactWithPlayer(player : SKSpriteNode, enemy : SKSpriteNode) { enemy.removeFromParent() lives -= 1 updateLabels() //another function that changes the score and lives labels } //CONTACT DETECTION func didBeginContact(contact: SKPhysicsContact) { let firstBody : SKPhysicsBody = contact.bodyA let secondBody : SKPhysicsBody = contact.bodyB if (firstBody.categoryBitMask == PhysicsCategory.enemy && secondBody.categoryBitMask == PhysicsCategory.bullet || firstBody.categoryBitMask == PhysicsCategory.bullet && secondBody.categoryBitMask == PhysicsCategory.enemy) { contactWithBullet(firstBody.node as! SKSpriteNode, bullet: secondBody.node as! SKSpriteNode) checkScore() enemiesInWave -= 1 } else if (firstBody.categoryBitMask == PhysicsCategory.enemy && secondBody.categoryBitMask == PhysicsCategory.player || firstBody.categoryBitMask == PhysicsCategory.player && secondBody.categoryBitMask == PhysicsCategory.enemy) { contactWithPlayer(firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode) checkLives() enemiesInWave -= 1 } } 才能致电Cat *。在C ++中,使用casting operators转换(转换)指针。

如果您确定(这可能会让您回到更大的程序中),getType()确实指向了班级array[0]的对象,您可以使用(请参阅ideone完整程序)

Cat

或者,简洁地说,

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

请注意,如果static_cast<Cat *>(array[0])->getType(); 不是指向array[0]的指针,则会失败。

只要您的类是多态的(包含虚拟成员),在您的情况下(基类指针和运行的派生方法的数组)可能就是这种情况,您可以使用Cat而不是{{ 1}}。它会产生运行时开销,但会检查转换是否有效,如果不是则返回dynamic_cast