我正在介绍C ++类,并且试图找出为什么我收到“调用没有匹配函数”错误的原因。我浏览了其他文章,但这些文章似乎主要是构造函数本身的问题。

这是简化的代码段:

基础班-船

// Members: shipName, shipBuiltYear
Ship::Ship(){ //implementation }
Ship::Ship(string name, string year){ //implementation }
void Ship::set(string name, string year){ //implementation }


派生类-PirateShip

// Members: numPirates
PirateShip::PirateShip() : Ship() { //implementation }
PirateShip::PirateShip(string name, string year, string pirates) : ship(name, year){ //implementation }
void PirateShip::set(int pirates){ //implementation }


在主要

Ship *ships[2] = {new Ship(), new PirateShip()};
ships[0] -> set("Luvinia", "2020"); // using setter from base class
ships[1] -> set("Skylin", "2030"); // using setter from base class
ships[1] -> set(100); // using setter from derived class


问题是您不能使用基类来设置PirateShip,然后再使用PirateShip来设置它?

我是否需要更改:

void PirateShip::set(int pirates){ //implementation }


至:

void PirateShip::set(string name, string year, string pirates)
{
    Ship::set(name, year);
    numPirates = pirates;
}




还是有其他方法可以做到这一点?

最佳答案

这里有两个问题。

第一:

Ship *ships[2] = {new Ship(), new PirateShip()};


这是指向两个对象的Ship部分的指针的数组。第一个是Ship,第二个是PirateShip。但是您只有一个指向ShipPirateShip部分的指针,因此只能(直接)与其交互。

如果Ship具有虚拟方法,则可以使用RTTI和dynamic_cast来查询给定的Ship*是否指向ShipPirateShip部分,如下所示:

auto* pirate = dynamic_cast<PirateShip*>(some_ship);


如果pirate非空,则some_ship指向ShipPirateShip部分。

注意,使用动态强制转换是代码异味;这可能意味着您应该改进基类接口,或者在这里没有指向基类的指针。



第二部分是如果您希望能够从Ship::set调用PirateShip*,则需要添加

using Ship::set;


PirateShip的正文。

10-04 12:29