【问题标题】:Does RTTI work with final?RTTI 是否适用于 final?
【发布时间】:2012-04-03 19:12:08
【问题描述】:

我正在通过 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.

【问题讨论】:

  • 查看我的个人资料以获取 C++11 草案链接。完整的最终标准不是免费提供的,您必须为此付费,这很可悲。
  • @RafałRawicki:在GitHub 上,可以使用较新的 N3376 (2012-02-28)。
  • @ipc:也可以直接从open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf获取n3376。
  • 啊,我相信这回答了 #2 stackoverflow.com/q/9965461/46642。我正在编辑问题以仅保留第一部分。
  • @ipc 我读到 N3242 与官方的不同之处仅在于编辑更改(错别字等)。从那以后是否有任何值得称道的变化?

标签: c++ c++11 rtti


【解决方案1】:

在基类中声明一个虚函数 final 可以防止它被覆盖 (10.3/4)。它仍然是继承的,因为所有成员都是继承的(模第 12 章,特殊成员函数)。因此,派生类是多态的(10.3/1),RTTI 可以工作。

(我假设你不会让你的 dtor final。那是行不通的。)

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2012-02-26
    • 1970-01-01
    • 2011-02-23
    • 2019-02-10
    相关资源
    最近更新 更多