- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
RTTI 被认为是糟糕设计的原因是什么?
Stroustrup 在他的书 TC++PL 中写道,最常见的使用 RTTI 技术的情况是使用 switch 指令,当人们想要根据传递对象的“真实”类型来决定应该执行什么代码时。给出了一个示例,其中形状类的对象被传递给函数,并根据形状是圆形、正方形、三角形等执行不同的操作。他写道,这种构造是一个应该替换的标志虚函数的 switch-case 序列。
最佳答案
RTTI 仅在您的类具有虚拟表时才有效。如果你有一个虚拟表,你可以实现虚拟功能。您应该使用虚函数而不是对象类型的开关的原因是它可以更好地处理继承链,并且在添加新类时不那么脆弱。
例如:
class A : public V {}
class B : public V{}
void do_something( const V & v )
{
if (typeid(A) == typeid(v)) { .. its an A .. }
if (typeid(B) == typeid(v)) { .. its a B .. }
}
int main()
{
do_something( A() );
do_something( B() );
}
现在,如果我们添加一个新类 C
也派生自 V
并调用 do_something( C() )
(不改变do_something
) ,什么都不会发生。 (编译时没有错误)。如果我们添加从 A
派生的类 D
也没有错误,也没有任何反应。
将此与虚函数的行为进行对比
struct V
{
virtual void do_something() const =0;
};
struct A
{
virtual void do_something() const { ... its an A ... }
}
struct B
{
virtual void do_somethine() const { ... its a B ... }
}
void do_something( const V & v )
{
v.do_something();
}
现在,如果我们从 V
派生 C
并且不实现 C::do_something()
,我们将得到一个编译时错误.如果我们从 A
派生 D
并且不实现 D::do_something()
我们将调用 A::do_something( )
。
所以这是虚函数优于 RTTI 的主要原因。然而,有时您可能会觉得 do_something
的行为不属于您的 V
或 A B C
类。因此,您很想使用 RTTI(通过 typeid
或 dynamic_cast
)。更好的解决方案通常是为类层次结构实现访问者模式。
关于c++ - RTTI 被认为是糟糕设计的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102569/
我想在这里说的是我在从之前离开的相同状态重新启动我的应用程序时遇到的问题。我在这方面做了很多研发,并且已经解决了 stackoverflow 中发布的问题。所以请不要说它是重复的。 我试过设置这些选项
当我在我的类中实现 __cmp__ 函数时,python 是否会在内部重载“==”,我们在 C++ 中是如何做到的? 只是好奇。我是 python 的新手。 :) 最佳答案 ==的含义当您定义 __c
我在 Raspberry Pi2 上安装了 Gitlab,几个月来它运行良好。但自从关闭了RPi的电源后,它就不再起作用了。网页返回502错误。 502 Whoops, GitLab is takin
有人知道用户登陆带有Webfonts的页面时为什么Google Chrome浏览器崩溃吗 它并不会一直发生,而是经常发生 我刚得到一个蓝屏页面,却不知道为什么:该页面不是来自重定向时就很好了。 这是我
当我登录时,Skype始终会给出此错误。 糟糕,Skype存在问题。尝试注销然后重新登录。 STARTUP_LOAD_ERROR MACBOOK 最佳答案 Macbook 用户 退出Skype 回家
我正在尝试从 flutter 开始,首先我在 cmd 上运行 flutter doctor 它有效。在我安装了 ANDROID SDK 之后,同样的命令 flutter doctor 给了我异常:
从 android studio 终端运行 flutter attach 不工作。显示错误flutter 意外退出。 终端输出: flutter attach Checking for adverti
当使用 TinyMCE 4 测试所有浏览器时,Chrome 非常慢。 (我尝试从 TinyMCE 中删除所有插件,但没有任何区别。) Chrome 需要大约 20-25 秒在 TinyMCE 中呈现一
我试图让下面的脚本工作,以便从远程服务器(服务器 1)读取特定目录中的 CSV 文件列表,并将数据移植到另一台服务器的 PostgreSQL 数据库中。 我已经创建了一个 rsa SSH key 并将
在嵌入式 linux 环境中(在 PowerPC 上定制的 2.4.25)几个小时后我得到以下内核 panic : Oops: kernel access of bad area, sig: 11 N
在将现有 Node.js (Hapi.js) + RethinkDB 从 OVH VPS(最小 vps)迁移到 AWS Lambda( Node )+ DynamoDB 的过程中,我最近遇到了一个非常
我是一名优秀的程序员,十分优秀!