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
。我是否忽略了一些事情,例如,这里是否存在潜在的未定义行为的可能性?有没有更好或更惯用的方法来达到同样的效果
我可以看到几个备选方案:
- 使用
:不可能出现未定义的行为,但我希望编译时不使用RTTIdynamic\u cast
- 使
和i
成为j
和A
的成员:如果其他层次结构使用B
和Base
派生
\u b
类型为Base
,是否有可能发生UBstatic_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
),它仍然存在,你是对的,我忽略了它。@RemyLebeauconst
是否存在,以防有人(用户)想要创建一个从B
派生的类C
,并且出于任何原因决定在它的一个方法中为\u B
指定一个Base*
类型的指针。@Raxvan我想我已经设置好了它,这样在调用B::get\u int
时,\u B
就不可能是Base
类型。