1

我正在做一个国际象棋游戏,当我点击一个正方形时,我想知道那里有什么棋子。由于有不止一种类型的片段,在 Square 结构中有更多变量会很烦人。

所以我有一个名为 Piece 的类,它是每种类型的 Piece 的父级。

例子。

class Pawn : public Piece

我想实现一个看起来像这样的 Square 结构:

struct Square { Piece *piece };

现在,我想像这样初始化片段变量:

piece = new Pawn(); // or what type of piece it should be.

我的问题是,通过这样做,我仍然只能访问 Piece 的类函数,而不是 Pawns 的。

我如何实现只有一位父母可以访问他的孩子所拥有的一切?

4

2 回答 2

4

你可以制作虚函数。在基类中定义虚函数并在子类中覆盖它。

例如

class Base
{
public:
    const char* SayHi() { return "Hi"; } // a normal non-virtual function    

    virtual const char* GetName() { return "Base"; } // a normal virtual function

    virtual int GetValue() = 0; // a pure virtual function
};
class Child:public Base{
{
    int GetValue(){
    //write any code here
    //return something;
    }
}

有关更多信息,请参阅链接: http: //www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-interface-classes/

于 2013-08-19T00:30:10.487 回答
3

到目前为止最好的方法是尽量避免这种情况:你能Piece为所有子类制作统一的接口吗?如果可以做到这一点,请毫不犹豫地选择此设计,因为我在下面描述的内容要复杂得多,也更难阅读。

由于您无法通过指向基类型的指针访问派生类型的成员函数,因此您需要通过以下几种方式之一解决此问题:

  • 使用dynamic_cast<Derived>- 这很简单,但非常脆弱。对继承结构的更改可能会破坏基于频繁动态转换的方法。
  • 使用VisitorPattern - 当类结构预计不会改变时,这是一个不错的选择(你很幸运:你计划建模的类型列表在许多世纪以来都没有改变)
  • 使用运行时类型信息和函数对象的映射- 这种方法非常灵活,但有点难以阅读。不过,C++11 的 Lambda 让它变得更容易。
于 2013-08-19T00:33:22.447 回答