gpt4 book ai didi

c++ - RTTI 被认为是糟糕设计的原因是什么?

转载 作者:行者123 更新时间:2023-11-30 04:25:33 25 4
gpt4 key购买 nike

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 的行为不属于您的 VA B C 类。因此,您很想使用 RTTI(通过 typeiddynamic_cast)。更好的解决方案通常是为类层次结构实现访问者模式。

关于c++ - RTTI 被认为是糟糕设计的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com