Is it bad design to check if an object is of a particular type by having some sort of ID data member in it?
class A
{
private:
bool isStub;
public:
A(bool isStubVal):isStub(isStubVal){}
bool isStub(){return isStub;}
};
class A1:public A
{
public:
A1():A(false){}
};
class AStub:public A
{
public:
AStub():A(true){}
};
Run Code Online (Sandbox Code Playgroud)
编辑1:问题是A包含许多虚函数,A1不会覆盖但存根需要,因为它表明你正在处理存根而不是实际的对象.这里的可维护性是个问题,对于我添加到A的每个函数,我需要在存根中覆盖它.忘记它意味着危险的行为,因为A的虚函数被存根的数据执行.当然我可以添加一个抽象类ABase,让A和Astub继承它们.但是设计变得足够严格以允许这个重构.A的引用持有者保存在另一个B类中.B用存根引用初始化,但稍后根据某些条件,B中的引用持有者用A1,A2等重新初始化.所以当我这样做时BObj.GetA (),我可以检查GetA(),如果refholder持有存根,然后在这种情况下给出错误.不执行该检查意味着,我必须使用适当的错误条件覆盖AStub中A的所有功能.
Ter*_*fey 14
一般来说,是的.你是一半OO,一半是程序性的.
确定对象类型后,您打算做什么?您可能应该将该行为放在对象本身(可能在虚函数中),并使不同的派生类以不同的方式实现该行为.那么你没有理由检查对象类型.
在您的具体示例中,您有一个"存根"类.而不是......
if(!stub)
{
dosomething;
}
Run Code Online (Sandbox Code Playgroud)
打电话吧
object->DoSomething();
Run Code Online (Sandbox Code Playgroud)
并且AStub中的实现是空的