继承,父进程在c ++中访问子进程

时间:2013-08-19 00:24:06

标签: c++ class implementation

我正在制作国际象棋游戏,当我点击一个广场时,我想知道那里有什么棋子。由于存在多于一种类型的片段,因此在Square结构中具有更多变量将是令人讨厌的。

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

实施例

class Pawn : public Piece

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

struct Square { Piece *piece };

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

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

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

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

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:3)

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

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

  • 使用dynamic_cast<Derived> - 这很简单,但非常脆弱。对继承结构的更改可能会破坏基于频繁动态强制转换的方法。
  • 使用VisitorPattern - 当预期类结构不会改变时,这是一个不错的选择(您在这里很幸运:您计划建模的类型列表没有在许多世纪改变了)
  • 使用Runtime Type Information和功能对象的地图 - 这种方法非常灵活,但有点难以阅读。但是,C ++ 11的Lambdas使它变得更容易。