我真的很想在多态类的声明中说一句:'不要编写任何代码,就可以强制转换为此类的类型。因为我知道没人会动态地转换为该类,所以为什么要牺牲效率。
struct Able{ virtual void do() = 0; };
struct A : Able{
/* no dynamic_cast for me */
void do() override{}
};
struct Able2{ void do2() = 0; };
struct B : A, Able2{
/* no dynamic_cast for me */
void do2() override{}
};
Able *b = new B;
assert(dynamic_cast<Able2*>(b));
assert(dynamic_cast<A*>(b) == nullptr);
assert(dynamic_cast<B*>(b) == nullptr);
我的问题是基于这样的知识,即从多态类型的每次继承,不可见的dynamic cast函数都会变得更大,并在派生类上进行类型检查时会再增加一个条目。
不是无法对这种类型的动态广播会影响性能,但是进行动态强制转换本身会使代码变慢。
可以通过完全禁用RTTI来消除RTTI空间开销,但是它将禁用所有类型的强制转换。如果您不在任何地方使用它们,而库头也不使用它,则可以接受。
一个也可以使用私有继承来强制类型系统将此类视为另一个的子类:
// Only B can see that it extends A and Able2, so no dynamic casts allowed.
struct B : private A, private Able2 {
void stuff2() override{}
A* get_a() {
return this;
}
Able2* get_able2() {
return this;
}
};
但是这不会解决RTTI二进制文件的大小开销。