C++ 检查哪个子类是父类对象

C++ 检查哪个子类是父类对象,c++,inheritance,C++,Inheritance,我们有一个作为参数传递给类的方法。这个类有不同的子类。我们需要知道哪些类是作为参数传递给该方法的类。由于赋值要求,我们不能为每个可能的类定义一个方法。此外,如果此方法不支持子类,则必须在编译时抛出错误。 我们一直在尝试使用static_cast来实现这一点,但由于两个子类之间的转换始终是可能的,因此我们没有获得所需的结果 class A{ ... }; class B : public A{ ... }; class C : public A{ ... } void foo(A a){

我们有一个作为参数传递给类的方法。这个类有不同的子类。我们需要知道哪些类是作为参数传递给该方法的类。由于赋值要求,我们不能为每个可能的类定义一个方法。此外,如果此方法不支持子类,则必须在编译时抛出错误。 我们一直在尝试使用static_cast来实现这一点,但由于两个子类之间的转换始终是可能的,因此我们没有获得所需的结果

class A{
...
};

class B : public A{
...
};

class C : public A{
...
}

void foo(A a){
    if(a is B){
        //OK and do stuff
    }else if(a is C){
        //throw compile error
    }
}

您可以将
foo
本身编写为模板,以便在编译时执行所有检查:

#include <type_traits>

template<class T>
void foo(T t)
{
  static_assert(std::is_same<T, C>::value == false,
                "foo() must not be invoked with object of class C");
  if (std::is_same<T, B>::value) {
    // do stuff
  }
}
#包括
模板
void foo(T)
{
静态断言(std::is_same::value==false,
“foo()不能与类C的对象一起调用”);
if(std::is_same::value){
//做事
}
}

static\u assert
用于某些条件的编译时检查,并且
std::is\u same
在编译时比较两种类型。

。。。顺便说一句,像这样使用,你的函数
foo
会受到影响;一般来说,如果你想得到一个好的@WhiZTiM,那么dynamic cast有什么帮助呢?在强制转换之前,您必须知道它是哪个子对象,但这里的对象是要找出它是哪个子对象。@Barmar,要找出运行时指向对象的指针或引用是哪个类实例,有两种语言工具可供使用,
dynamic\u cast
typeid
;使用
dynamic_cast
,OP可以尝试将其结果与一组已知的封闭类型相匹配,如果强制转换失败,它将为指针强制转换返回
nullptr
,否则为引用强制转换返回。不,
dynamic_cast
是最软的登陆,它从不调用UB;(除非你努力让它这么做)“必须在编译时抛出错误”听起来像是模板函数的作业。实际上,普通函数也可以
void foo(C const&)=delete。但不确定这是否可以接受。正如当前在问题中所述,
foo
函数中的检查是无用的,因为
a
的类型总是
a
。所以很难猜测foo应该做什么。