C++ 正确(安全)使用“静态”铸件`

C++ 正确(安全)使用“静态”铸件`,c++,casting,C++,Casting,我正在使用这种模式: struct Base { int i; }; struct Derived: Base { int j; }; class A { public: A(Base* b): _b(b) { } virtual int get_int() { return _b->i; } protected: Base* const _b; }; class B: public A { public: B(Derive

我正在使用这种模式:

struct Base {
    int i;
};

struct Derived: Base {
    int j;
};

class A {
  public:
    A(Base* b): _b(b) { }
    virtual int get_int() { return _b->i; }
  protected:
    Base* const _b;
};

class B: public A {
  public:
    B(Derived* d): A(d) { }
    int get_int() { return static_cast<Derived* const>(_b)->j; }
};
struct Base{
int i;
};
派生结构:基{
int j;
};
甲级{
公众:
A(基*b):_b(b){}
虚拟整数get_int(){return\u b->i;}
受保护的:
基本常数b;
};
B类:公共A{
公众:
B(派生*d):A(d){}
int get_int(){return static_cast(_b)->j;}
};
对我来说,使用
static\u cast
看起来很安全,因为
const
可以防止从
B
派生的类将
基*
分配给
\u B
。我是否忽略了一些事情,例如,这里是否存在潜在的未定义行为的可能性?有没有更好或更惯用的方法来达到同样的效果

我可以看到几个备选方案:

  • 使用
    dynamic\u cast
    :不可能出现未定义的行为,但我希望编译时不使用RTTI
  • 使
    i
    j
    成为
    A
    B
    的成员:如果其他层次结构使用
    Base
    派生

如果
\u b
类型为
Base
,是否有可能发生UB
static_cast
只检查类型兼容性,而不检查实例是否实际为派生类型。避免动态转换的一种方法是手动跟踪实例类的类型。在这种情况下,您需要在Base中添加一个私有成员,指示类的类型。或者您可以创建一个虚拟函数
枚举类型{BaseClass,DerivedClass};虚拟类型getType(){return BaseClass;或return DerivedClass;,具体取决于实现它的位置}
使此代码工作的不是
const
。事实上,
B
构造函数不允许将
派生的
或后代以外的任何东西分配给
\u B
。但是,有一种情况您没有处理-如果
B
是用NULL
派生的*
构造的,那么
\u B
在被
get\u int()
@RemyLebeau访问时是NULL的,因为NULL问题是独立的(即使我们只处理
a
Base
),它仍然存在,你是对的,我忽略了它。@RemyLebeau
const
是否存在,以防有人(用户)想要创建一个从
B
派生的类
C
,并且出于任何原因决定在它的一个方法中为
\u B
指定一个
Base*
类型的指针。@Raxvan我想我已经设置好了它,这样在调用
B::get\u int
时,
\u B
就不可能是
Base
类型。