考虑以下一组类/接口(interface):
class IFish{
public:
virtual void eat() = 0;
}
class IFriendly{
public:
virtual void protect() = 0;
}
class IAggresive{
public:
virtual void attack(Point inDest) = 0;
}
class CDolphin : public IFish, IFriendly{
eat...
protect....
}
class CShark : public IFish, IAggresive{
eat....
attack...
}
现在我正在上课
void CDiver
{
Void shouldRunAway(IFish* fish)
{
//???
}
}
我的问题是,“shouldRunAway”是否可以从 fish 参数中提取它是 IAggresive 还是 IFreindly(如果它是其中任何一个......)是否有某种类型的转换可以提供帮助?
最佳答案
扩展 Drakosha 发布的内容,您可以将 IFish 指针动态转换为 IAggressive 指针并检查它是否为 NULL。像这样;
#include <iostream>
class IFish {
public:
virtual void eat() = 0;
};
class IFriendly {
public:
virtual void protect() = 0;
};
class IAggressive {
public:
virtual void attack() = 0;
};
class Dolphin : public IFish, public IFriendly {
public:
virtual void eat() {
std::cout << "Dolphin::eat()\n";
}
virtual void protect() {
std::cout << "Dolphin::protect()\n";
}
};
class Shark : public IFish, public IAggressive {
public:
virtual void eat() {
std::cout << "Shark::eat()\n";
}
virtual void attack() {
std::cout << "Shark::attack()\n";
}
};
class Diver {
public:
void shouldRunAway( IFish *fish ) {
if ( dynamic_cast<IAggressive *>( fish ) != NULL ) {
std::cout << "Run away!\n";
} else {
std::cout << "Don't run away.\n";
}
}
};
int main( int argc, char *argv[] ) {
Dolphin dolphin;
Shark shark;
Diver diver;
diver.shouldRunAway( &dolphin );
diver.shouldRunAway( &shark );
return 0;
}
关于c++ - 多接口(interface)继承。从一个类型转换到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1023511/