我正在介绍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
。但是您只有一个指向Ship
的PirateShip
部分的指针,因此只能(直接)与其交互。如果
Ship
具有虚拟方法,则可以使用RTTI和dynamic_cast
来查询给定的Ship*
是否指向Ship
的PirateShip
部分,如下所示:auto* pirate = dynamic_cast<PirateShip*>(some_ship);
如果
pirate
非空,则some_ship
指向Ship
的PirateShip
部分。注意,使用动态强制转换是代码异味;这可能意味着您应该改进基类接口,或者在这里没有指向基类的指针。
第二部分是如果您希望能够从
Ship::set
调用PirateShip*
,则需要添加using Ship::set;
到
PirateShip
的正文。