c++ - 使用Stroustrup示例的dynamic_cast <>问题

标签 c++ c++11

我正在Stroustrup C++ 4th Ed Page 642中测试dynamic_cast <>示例,但无法编译。我直接从书中使用以下图片,试图了解其工作原理。有谁知道这是Eratta(不在他发表的勘误文档中)还是我看错了什么?
Stroustrup图形,虚线表示 protected :
Page 642 graphic

#include <iostream>
using namespace std;

// H = Ival_box
class H {
};

// G = Ival_slider
class G : public H {
};

// I = BBwindow
class I {
};

// F = BB_slider
class F : public I {
};

// X = BB_ival_slider
class X : public G, protected F {
};


int main(int argc, char *argv[])
{
    // works
    X xx{};
    if (auto p = dynamic_cast<G*>(&xx))
        cout << "X*...G*" << endl;

    // works
    G gg{};
    if (auto p = dynamic_cast<H*>(&gg))
        cout << "G*...H*" << endl;

    // compilation error, 'I' is not polymorphic
    I ii{};
    if (auto p = dynamic_cast<H*>(&ii))
        cout << "I*...H*" << endl;

    return 0;
}
编译结果:
clang++ -std=c++11 -pedantic -Wall test164.cc && ./a.out
test164.cc:31:18: error: 'I' is not polymorphic
    if (auto p = dynamic_cast<H*>(&ii))
                 ^                ~~~
1 error generated.
编译和有错误的结果被注释掉:
clang++ -std=c++11 -pedantic -Wall test164.cc && ./a.out
X*...G*
G*...H*

最佳答案

该错误说明了错误所在。动态转换仅适用于多态类型(在继承层次结构中向上转换时除外)。
一个类只有具有至少一个虚函数时才是多态的。 I没有任何虚拟功能。因此它不是多态的。您必须将一个虚拟函数添加到I才能起作用。
请注意,即使那样,dynamic_cast<H*>(&ii)也永远不会是非null指针(即true),因为ii并不是H类型的对象的基础子对象。

关于c++ - 使用Stroustrup示例的dynamic_cast <>问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62642405/

相关文章:

c++ - 返回 *this 给出 Weffc++ 警告

c++ - 在 cmake 中使用 Pcap++ 库

c++ - MurmurHash3可以分多个部分对数据 block 进行哈希处理吗?

multithreading - 使用 std::future 和 valgrind 的一次性事件通信

C++11 反向基于范围的 for 循环

c++ - 如何在 native C++ 中跨线程调用(在主线程上回调)

c++ - 在 Linux 中编译/链接多个 C++ 库

c++ - 原始类型初始化的构造函数语法和赋值语法之间的差异

c++ - 如何检查模板类型是否是变体类型的类型之一?

c++ - 隐式转换和运算符重载