2009-06-21 33 views
3

考慮下面的一組類/接口的:多接口inhertience。從一個鑄造到另一個

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」摘錄無論是IAggresive還是IFreindly(如果它們是這些中的任何一個......)是否有某種類型的演員可以幫忙?

回答

4

擴展在什麼Drakosha貼,你會dynamic_cast的IFISH的指針到IAggressive指針並檢查是否爲空或不是。喜歡這個;

#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; 
} 
3

看看dynamic_cast

+0

我知道動態轉換是什麼。事情是,據我所知,Dynamic_cast只允許你從基類轉換到子類。在我們的情況下,IFriendly和IAggresive不是IFish的子類,你能澄清你對這個問題的答案嗎?謝謝! – user88637 2009-06-21 10:44:36

+0

看廚房回答: void shouldRunAway(IFish * fish)if(dynamic_cast (fish)!= NULL){ std :: cout <<「Run away!\ n」; }其他{ std :: cout <<「不要逃跑。\ n」; }} – Drakosha 2009-06-21 15:00:05

1

接口定義什麼類確實,而不是什麼是。你不應該把它們用作「是」的關係。在你的情況下,最好在IFish界面中定義一個IsDangerous()方法。

在這種情況下,鑄造是在C++中可能的,但是這將是糟糕的設計。

-2

,如果這是Java中,你可以這樣做:

if(fish instanceof IAggressive) 
    runAway(); 

或許有一些C++相同呢?我聽說過很多關於RTTI的信息。有幫助嗎?

JRH

1

你可以使用訪問者模式,如果你不喜歡的dynamic_cast

#include <iostream> 

class Diver; 

class IFish { 
public: 
    virtual void eat() = 0; 
    virtual void visit(Diver*) = 0; 
}; 

class IFriendly { 
public: 
    virtual void protect() = 0; 
}; 

class IAggressive { 
public: 
    virtual void attack() = 0; 
}; 

class Diver { 
public: 
    void shouldRunAway(IFish *fish) { 
     fish->visit(this); 
    } 

    void runAway() 
    { 
     std::cout << "Run away!\n"; 
    } 

    void dontRunAway() 
    { 
     std::cout << "Don't run away!\n"; 
    } 
}; 

class Dolphin : public IFish, public IFriendly { 
public: 
    virtual void eat() { 
     std::cout << "Dolphin::eat()\n"; 
    } 

    virtual void protect() { 
     std::cout << "Dolphin::protect()\n"; 
    } 

    virtual void visit(Diver* diver) 
    { 
     diver->dontRunAway(); 
    } 
}; 

class Shark : public IFish, public IAggressive { 
public: 
    virtual void eat() { 
     std::cout << "Shark::eat()\n"; 
    } 

    virtual void attack() { 
     std::cout << "Shark::attack()\n"; 
    } 

    virtual void visit(Diver* diver) 
    { 
     diver->runAway(); 
    } 
}; 

int main(int argc, char *argv[]) { 
    Dolphin dolphin; 
    Shark shark; 
    Diver diver; 

    diver.shouldRunAway(&dolphin); 
    diver.shouldRunAway(&shark); 

    return 0; 
}