c++ - 多接口(interface)继承。从一个类型转换到另一个

标签 c++

考虑以下一组类/接口(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/

相关文章:

c++ - 使用 string::find 查看字符串中是否有两个空格,此代码中的错误?

c++ - Qt Creator 中使用 opencv 的程序意外崩溃

c++ - GCC 上虚拟继承行为的奇怪默认空构造函数

c++ - std::map 的单元测试

c++ - 对 C++ 中的二维数组感到困惑

c++ - 如何确保显式构造函数被调用并允许大括号初始化?

C++ 共享所以库在运行时改变

c++ - 在 C++ 中使用 ctags 查找用构造函数声明的变量

c++ - 使用过滤器打开文件对话框

c++ - Cpp中的 “1”和 '1'是否不同?如果是,那怎么办?