如何检查对象的类型是否是 C++ 中的特定子类?

2021-12-09 00:00:00 class subclass identification c++

我正在考虑使用 typeid() 但我不知道如何询问该类型是否是另一个类的子类(顺便说一下,它是抽象的)

I was thinking along the lines of using typeid() but I don't know how to ask if that type is a subclass of another class (which, by the way, is abstract)

推荐答案

你真的不应该.如果您的程序需要知道一个对象是什么类,这通常表明存在设计缺陷.看看你是否可以使用虚函数获得你想要的行为.此外,有关您正在尝试执行的操作的更多信息会有所帮助.

You really shouldn't. If your program needs to know what class an object is, that usually indicates a design flaw. See if you can get the behavior you want using virtual functions. Also, more information about what you are trying to do would help.

我假设你有这样的情况:

I am assuming you have a situation like this:

class Base;
class A : public Base {...};
class B : public Base {...};

void foo(Base *p)
{
  if(/* p is A */) /* do X */
  else /* do Y */
}

如果这是你所拥有的,那么尝试做这样的事情:

If this is what you have, then try to do something like this:

class Base
{
  virtual void bar() = 0;
};

class A : public Base
{
  void bar() {/* do X */}
};

class B : public Base
{
  void bar() {/* do Y */}
};

void foo(Base *p)
{
  p->bar();
}

由于关于这个答案的争论在这么多年后仍在继续,我想我应该提供一些参考资料.如果您有一个指向基类的指针或引用,并且您的代码需要知道对象的派生类,那么它违反了 Liskov 替换原则.鲍勃叔叔 称之为对面向对象设计的诅咒".

Since the debate about this answer still goes on after so many years, I thought I should throw in some references. If you have a pointer or reference to a base class, and your code needs to know the derived class of the object, then it violates Liskov substitution principle. Uncle Bob calls this an "anathema to Object Oriented Design".

相关文章