首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Stroustrup示例的dynamic_cast<>问题

使用Stroustrup示例的dynamic_cast<>问题
EN

Stack Overflow用户
提问于 2020-06-30 00:18:20
回答 1查看 54关注 0票数 1

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

Stroustrup图形,虚线表示受保护:

代码语言:javascript
复制
#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;
}

编译和结果:

代码语言:javascript
复制
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.

已注释掉错误的编译和结果:

代码语言:javascript
复制
clang++ -std=c++11 -pedantic -Wall test164.cc && ./a.out
X*...G*
G*...H*
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-30 00:24:46

该错误说明了错误所在。动态强制转换只允许多态类型(除了在继承层次中向上强制转换时)。

只有当一个类至少有一个虚函数时,它才是多态的。I没有任何虚函数。因此,它不是多态的。您必须向I添加一个虚函数,才能使其正常工作。

请注意,即使这样,dynamic_cast<H*>(&ii)也不能是非空指针(即true),因为ii不是H类型的对象的基子对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62642405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档