我在Stroustrup C++第4版642页上测试了一个dynamic_cast<>示例,但它不能编译。我直接从书中使用下面的图片,试图了解它是如何工作的。有没有人知道这是Eratta (不在他发布的勘误表文档中),还是我读错了什么?
Stroustrup图形,虚线表示受保护:

#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*发布于 2020-06-30 00:24:46
该错误说明了错误所在。动态强制转换只允许多态类型(除了在继承层次中向上强制转换时)。
只有当一个类至少有一个虚函数时,它才是多态的。I没有任何虚函数。因此,它不是多态的。您必须向I添加一个虚函数,才能使其正常工作。
请注意,即使这样,dynamic_cast<H*>(&ii)也不能是非空指针(即true),因为ii不是H类型的对象的基子对象。
https://stackoverflow.com/questions/62642405
复制相似问题