c++ - C++多态中,如何避免函数的名字隐藏(调用错误没有匹配的函数)?

标签 c++ polymorphism

我正在介绍 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。但是您只有一个指向 PirateShipShip 部分的指针,因此只能(直接)与其交互。

如果 Ship 有虚拟方法,那么您可以使用 RTTI 和 dynamic_cast 来查询给定的 Ship* 是否指向 Ship 像这样的 PirateShip 的一部分:

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

如果 pirate 不为空,则 some_ship 指向 PirateShipShip 部分。

请注意,使用动态转换是代码味道;这可能意味着您应该改进基类接口(interface),或者在此处没有指向基类的指针。


第二部分是如果你想从PirateShip*调用Ship::set,你需要添加

using Ship::set;

PirateShip 的主体。

关于c++ - C++多态中,如何避免函数的名字隐藏(调用错误没有匹配的函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53588171/

相关文章:

android - kotlinx-序列化 : Polymorphic serializer was not found for missing class discriminator ('null' )

C++ const 成员函数返回对类成员的引用

c++循环缓冲区使用大磁盘文件

java - 参数多态性与 Ad-hoc 多态性

c++ - 在基类中混合使用虚函数和非虚函数是否是一种糟糕的编程习惯?

c# - 如何在 C# 中将实例变量视为另一种类型的实例

c++ - 如何修复编译错误 : non-template 'iterator1' used as template

c++ - 如何在 C++ 中使用 C'tor 生成 2 个不同的随机数字数组?

c# - 为什么 C 语言在 if 语句中需要围绕简单条件的括号?

java - 在此代码中如何选择一种方法而不是另一种方法?