我对c ++对象编程有点新意,需要一些帮助。
让我们说我有类Animal和子类cat。 在主程序中,我创建了一个指向Animal的指针数组,如下所示:
Animal* array[10];
array[0] = new Cat();
子类cat有自己的整数,方法getType返回该整数。我想知道如何称呼这种方法。
我试过了:
array[0]->getType()
但它说,该方法无法解决,而且Animal类没有名为getType的成员。 我也试图让这个方法变得虚拟,但仍然没有用。 任何解决方案?
此致
答案 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
:
Animal
class Animal
Animal
(见示例)所以你的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
。