gpt4 book ai didi

c++ - 我们在A(派生类) "is a"B(基类)时使用继承。当A "can be"B或C时我们怎么办?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:42 24 4
gpt4 key购买 nike

抱歉提出这个丑陋的问题,但我不知道该如何表达。我将举例说明我的意思:

人类可以是法师也可以是战士,所以法师和战士可以继承人类。但是,如果 Orc 也可以兼而有之呢?我们不能说“人是战士”或“战士是人”。 Orc 和 Human(或者一个父类,Humanoid)是否继承了所有的技能,然后选择使用什么?

我不知道是否应该标记特定语言,因为这是关于 oop 的一般性问题,但由于不同的语言对同一问题可能有不同的方法,所以我更喜欢从 C++ 的角度来回答。

最佳答案

改进您的建模

  1. 抽象类种族,具体类人类、兽人等...
  2. 抽象类Class,具体类Mage、Warrior等...

例如,在计算法师的统计数据时,向种族(不是人类或兽人)询问 int get_intelligence_bonus() 之类的事情(Race 中的抽象函数)。如果可能的话,互动应该发生在种族类(Class)之间,而不是具体的对应物。

使用合成来实际构建你的角色:

Character::Character( std::unique_ptr<Race> r, std::unique_ptr<Class> c ) 
{
// calculate stats, etc...
}

您可以使用纯 OOP 进行动态绑定(bind),或者如果您愿意,可以使用模板进行静态时间绑定(bind),但这是一个正交实现问题。无论哪种方式,您都需要正确设置类层次结构。

如果您是 C++ 的新手,或者如果您只需要构造函数中的 race 和 class,您可以使用 const&而不是 std::unique_ptr<> .但是,如果您认真学习 C++,请务必阅读所有权语义变量生命周期,以便更好地理解 std::unique_ptr<> .

http://en.cppreference.com/w/cpp/memory/unique_ptr

关于c++ - 我们在A(派生类) "is a"B(基类)时使用继承。当A "can be"B或C时我们怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24375688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com