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