我正在介绍 C++ 类(class),我试图找出为什么我会收到“没有匹配的调用函数”错误。我浏览了其他帖子,但这些似乎主要是构造函数本身的问题。
这是简化的片段:
基础类 - 船舶
// Members: shipName, shipBuiltYear
Ship::Ship(){ //implementation }
Ship::Ship(string name, string year){ //implementation }
void Ship::set(string name, string year){ //implementation }
在派生类中 - 海盗船
// 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
。但是您只有一个指向 PirateShip
的 Ship
部分的指针,因此只能(直接)与其交互。
如果 Ship
有虚拟方法,那么您可以使用 RTTI 和 dynamic_cast
来查询给定的 Ship*
是否指向 Ship
像这样的 PirateShip
的一部分:
auto* pirate = dynamic_cast<PirateShip*>(some_ship);
如果 pirate
不为空,则 some_ship
指向 PirateShip
的 Ship
部分。
请注意,使用动态转换是代码味道;这可能意味着您应该改进基类接口(interface),或者在此处没有指向基类的指针。
第二部分是如果你想从PirateShip*
调用Ship::set
,你需要添加
using Ship::set;
到 PirateShip
的主体。
关于c++ - C++多态中,如何避免函数的名字隐藏(调用错误没有匹配的函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53588171/