java - Java 的 instanceof 的 C++ 版本是什么? : checking, 未转换

标签 java c++ inheritance visual-studio-2015 instanceof

<分区>

我目前正在进行一个学校项目,我必须在其中将 Java 程序“翻译”成 C++。

该程序模拟媒体库并使用继承。基本上,您有一个可以向其中添加项目的媒体库。您可以添加的不同类型的项目是书籍、电影和音乐专辑。

我有一个类库,它主要创建一个实例,并且有一个容器来容纳我的所有项目。 Item 是父类(super class),Book、Movie 和 MusicAlbum 是它的派生类。

这是我在从 Java 转换为 C++ 时遇到问题的地方:

我的导师提供了“Main.cpp”,我必须以此为基础编写程序的其余部分。我不允许修改它或分配无效。但是,“Main.cpp”调用

cout << item << endl;

每次它向媒体库添加一个项目。因此,这当然会将它发送到 Item.cpp ,我已经在其中覆盖了 << 运算符。

现在,在编写用于输出其数据的代码之前,我必须能够弄清楚该“项目”是书籍、电影还是 MusicAlbum,因为这些东西中的每一个都需要以不同的方式打印。

在我的 Java 程序中,我写了类似这样的东西:

if(item instanceof Book){
    System.out.println((Book) item); // I overrode "toString" in Book.Java
}
elseif(item instanceof Movie){
    System.out.println((Movie) item); // overwrode "toString" in Movie.java
}
else
{
    System.out.println((MusicAlbum) item; // overrode "toString" in MusicAlbum.java

如您所见,我使用 instanceof 来确定它是哪种类型的项目,然后在覆盖派生类的所有“toString”方法之后,将项目转换为该派生类型,然后将其传递给 println。

我不知道如何在 C++ 中执行此操作。我在 stackoverflow 和其他论坛上查看了大量类似的问题,他们要么建议我尝试过但没有用的东西,要么告诉你如何将项目转换为派生类型,而不是如何 -check - 它是哪个派生类型而不首先实际更改它。

如果有人知道这在 C++ 中是如何工作的,我将不胜感激。谢谢。

最佳答案

通过使用 dynamic_cast<T>您可以尝试转换为派生类指针。如果它成功了,那就是正确的类型。如果它失败了,那么它就不是。

if( dynamic_cast<Book*>(item) ) { // stuff }

C++ 确实提供了有限的编译时间方法来检查某些事情。例如,您可以检查某物是否是派生类 std::is_base_of<base, derived>

还有std::is_same<type1, type2>

问题是这些是编译时分辨率。运行时多态性自然意味着您在运行时之前无法真正知道您的具体类型是什么。

编辑:添加一些可能对您的情况更有用的信息。

cout << item << endl; ,据我所知,你所做的并不能解决你的问题。动态类型识别无论如何都是糟糕的设计,你应该避免它。

不,在这种情况下您需要利用多态性。你会想要制作 operator<<虚拟的。您的子类将有自己的打印数据的方式。

cout << item << endl;被调用,你不需要弄清楚类型。将为您进行 vtable 查找,您将获得所需的行为。

唯一的问题是您可能需要一个介于重载和免费之间的中间人 operator>> .本质上,您将拥有一个像我提到的虚拟运算符,但您需要一个重载以确保它被正确调用,因为它是一个类成员而不是一个自由函数。

Look here for details

关于java - Java 的 instanceof 的 C++ 版本是什么? : checking, 未转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091841/

相关文章:

C++数组未声明的标识符错误

c++ - 使用声明对两个完全相同名称的名称查找的影响

java - 扩展 AbstractStringBuilder 并在哈希表中使用子类时出现问题

c++ - 在 C++ 中采用基类指针的函数,该指针重载了指向子类的指针

java - Intent 构造函数的上下文参数

java - 通过 Java 使用自定义 WCF 用户名/密码 (UserNamePasswordValidator) 身份验证

java - 如何将字符串转换为表示小时、分钟和秒的日期对象

java - 查找数组列表中的最大值

java - 在 JTextField 中显示整数

c++ - Eigen 库 : Different behaviors between static and dynamic size matrices when computing inverse