【问题标题】:(C++); Dynamically decide type of a function (derived class)(C++);动态决定函数的类型(派生类)
【发布时间】:2018-04-30 22:52:00
【问题描述】:

我是 C++ 新手,我被困在我的程序中。这是一个模仿棋盘游戏“战舰”的程序。我们得到了要编辑的代码,我们被要求做的一件事是让程序提示您要放下哪种船(目前只有一艘船)。

我们被赋予了一个特定的船类(Submarine)来开始,我把它做成了一个Ship父类。我计划为每种船型使用派生类,但 Game 类下的函数具有原始 Submarine 类 (&submarine) 的参数(现在是Ship,所以参数是&Ship)。我试图弄清楚如何动态决定参数的类型,以便我可以使用放置船舶的函数。

有没有办法做到这一点?我们只是学习了父/子类,还没有学习模板,这是我一直看到的常用方法。我也看到很多使用虚函数来解决与我类似的解决方案,但我不太明白这对我的情况有何帮助。

这是我之前谈到的一个函数示例(在 Game 类下):

 bool placePiece(Ship& piece) // Ship is parent class -- want it to be derived class (1 of 5 options) depending on which class is being used
{
    cout << "What coordinate do you want to place the " << toLower(piece.getName()) << " (length "<<piece.getLength()<<") at?\n";
    string coordinate = toLower(requeststring());
    cout << "What direction do you want the piece to go? (up, down, left or right)\n";
    string direction = toLower(requeststring());

    piece.setPiece(rowCharToInt(getFirstChar(coordinate)), getFirstInt(coordinate)-1, getFirstChar(direction));

    return isValidPlacement(playerBoard, piece);
}

如果需要更多信息,请告诉我!

谢谢

【问题讨论】:

    标签: c++ polymorphism dynamic-binding


    【解决方案1】:

    您不需要模板。

    我从你的问题中理解了以下内容

    1. 您获得了一个 submarine 类,您将其重命名为 ship
    2. 您计划制作 ship 的子类,例如 battleshipsubmarine
    3. 您在 Game 类中有一些函数接受 ship 对象,并且您希望动态接受 ship 的任何派生类。

    正确吗?

    仅当您希望所考虑的类型完全没有关系时,您才需要模板。这不是这里的情况。

    凭借多态性,您的方法已经能够处理您想要的。

    考虑一个简单的例子,如下所示

    #include <iostream>
    
    class Base {
    public:
            int a;
    };
    
    class Derived : public Base {
    public:
            int b;
    };
    
    void doge(Base foo) {
            std::cout << "My a value: " << foo.a << std::endl;
    }
    
    int main() {
            Derived d;
            d.a = 5;
            doge(d);
            return 0;
    }
    

    注意doge 函数如何接受和期望一个Base 对象,但我们向它发送一个Derived 对象。这是有效的,因为这本质上是由类多态性保证的。

    只要根据船的类型你不做不同的事情,你的方法应该有效。但是,如果是这种情况,最好制作 使用重载函数和强制转换

    这也导致了称为Liskov Substitution Principle 的OOP 原则。该原则要求您对基类和派生类对象进行建模,以便派生类的对象始终可以代表基类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多