RTTI被认为是糟糕的设计的原因是什么
what is a reason for which RTTI is considered as a bad design?
RTTI被认为是糟糕设计的原因是什么
Stroustrup在他的书TC++PL中写道,使用RTTI技术最常见的情况是切换指令,当人们想根据传递对象的"真实"类型来决定应该执行什么代码时。给出了一个例子,其中形状类的对象被传递给函数,并根据形状是圆形、方形、三角形等执行不同的操作。
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() );
}
现在,如果我们添加一个同样从V
派生的新类C
并调用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
)。更好的解决方案通常是实现类层次结构的访问者模式。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- RTTI被认为是糟糕的设计的原因是什么
- 警告'RTTI symbol not found for class'是什么意思?