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

标签 c++ polymorphism dynamic-binding

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

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

有没有办法做到这一点?我们刚学了parent/child classes,还没有学template,这是我一直看到的常用方法。我还看到很多使用虚函数来实现与我的类似的解决方案,但我不太明白这对我的情况有何帮助。

这是我之前谈到的函数示例(在 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);
}

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

谢谢

最佳答案

您不需要模板。

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

  1. 你得到了一个潜艇类,你将它重命名为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 原则。 .该原则要求您以派生类的对象始终可以代表基类的方式对基类和派生类对象建模。

关于c++ - (C++);动态决定函数的类型(派生类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50109238/

相关文章:

c++ - 命名空间范围问题

c++ - 在 Mac OSX 中替代 --no-undefined

c++ - 访问冲突写入位置 0xCCCCCCCC

python - 多态性的实际例子

Objective-C 使用动态绑定(bind),但是如何呢?

c++ - 在具有动态链接的 Mac OSX 上使用 OpenMP 编译 C++

c++ - 派生函数图

派生类的 C# 转换

java - 编译时链接和运行时链接有什么区别?

java - 覆盖方法和动态绑定(bind)