(C ++);动态决定函数的类型(派生类)

时间:2018-04-30 22:52:01

标签: c++ polymorphism dynamic-binding

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

我们开始使用某个船级( Submarine ),我将其作为 Ship 父类。我计划为每种船型使用派生类,但游戏类下的功能具有原始潜艇类(&潜艇)的参数(其中现在发货,因此参数为& Ship)。我试图找出如何动态决定参数的类型,以便我可以使用放置船舶的功能。

有办法做到这一点吗?我们刚刚学习了父/子课程,还没有学过模板,这是我见过的常用方法。我也看到很多虚拟函数用于类似于我的解决方案,但我不太明白这将如何有助于我的场景。

以下是我之前谈到过的一个函数示例(在游戏类下):

 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);
}

如果需要更多信息,请与我们联系!

谢谢

1 个答案:

答案 0 :(得分:1)

您不需要模板。

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

  1. 您获得了一个潜艇类,您将其重命名为 ship
  2. 您打算制作 ship 的子类,例如战舰潜水艇
  3. Game 类中有一些函数可以接受 ship 对象,并且您希望动态接受 ship 的任何派生类。
  4. 正确?

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

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

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

    #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原则。该原则要求您对基类和派生类对象进行建模,使得派生类的对象始终可以代表基类。