是否可以禁止将类动态转换为?

问题描述 投票:1回答:1

我真的很想在多态类的声明中说一句:'不要编写任何代码,就可以强制转换为此类的类型。因为我知道没人会动态地转换为该类,所以为什么要牺牲效率。

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函数都会变得更大,并在派生类上进行类型检查时会再增加一个条目。

c++
1个回答
1
投票

不是无法对这种类型的动态广播会影响性能,但是进行动态强制转换本身会使代码变慢。

可以通过完全禁用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二进制文件的大小开销。

© www.soinside.com 2019 - 2024. All rights reserved.