RTTI与final关键字一起使用是否有效?

3
我正在通过Stroustrup的C++11 FAQ学习C++11。我有一个问题。
如果一个虚函数在一个类中被定义为final,那么RTTI(dynamic_cast和typeid)是否仍然可以在其派生类上工作?
@MSalters:我的意图是,假设:
struct A {
    virtual void f() final; // only one virtual function, but final
};
struct B : A {
};
A* pa = new B;
B* pb = dynamic_cast<B*>(pa); // would this work? I guess it applies to typeid as well.

1
查看我的个人资料,获取C ++11草案链接。完整的最终标准不免费提供,您必须付款购买,这很遗憾。 - Rafał Rawicki
@RafałRawicki:在GitHub上可以找到更新的N3376(2012-02-28)。 - ipc
@ipc: 另外,你还可以直接从http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf获取n3376。 - kennytm
2
啊,我相信这回答了问题#2 https://dev59.com/iGkw5IYBdhLWcg3wVpFi。我正在编辑问题,只保留第一部分。 - R. Martinho Fernandes
@RafałRawicki 是的,在 N3242 和 N3290 之间有实质性的更改,尽管很少。 SFINAE 被扩展以覆盖访问控制违规,我认为还有其他一些事情。幸运的是,现在已经有了另一个草案 N3290 之后(即用于下一个标准,但仅是错别字/编辑更改),所以您可以再次保持更新。 - Potatoswatter
显示剩余3条评论
1个回答

3
在基类中声明一个虚函数为final可以防止它被覆盖(参见10.3/4)。尽管如此,它仍然会被继承,因为所有成员都会被继承(除了第12章的特殊成员函数)。因此,派生类是多态的(参见10.3/1),并且RTTI可以正常工作。
(我假设您不会将您的析构函数声明为final。这是无效的。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接