多接口继承。从一个投射到另一个

use*_*637 3 c++

考虑以下一组类/接口:

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...
}
Run Code Online (Sandbox Code Playgroud)

现在我有以下课程

void CDiver
{

Void shouldRunAway(IFish* fish)
{
//???
}

}
Run Code Online (Sandbox Code Playgroud)

我的问题是,无论是 IAggresive 还是 IFreindly(如果是这些中的任何一个......),“shouldRunAway”是否可以从 fish 参数中提取,是否有某种类型的转换可以提供帮助?

xia*_*ian 5

扩展 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;
}
Run Code Online (Sandbox Code Playgroud)