Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:是类的实例后代_C++ - Fatal编程技术网

C++ C++;:是类的实例后代

C++ C++;:是类的实例后代,c++,C++,假设我们有三个类A,B和C。B是从A派生的,C是从B派生的。 现在我们有了一个指向类a对象的指针。由于多态性,它实际上可以指向所有三个类的实例 使用typeid()我可以检查指针实际引用的类型。但我试图确定它是否指向类B的任何后代。也就是说,我正在寻找某种IsDescendatof(unkownclass,baseclass)函数。在C++中有什么原因吗?< P>使用 DyrimeCase< 。失败时返回空值: B* pb = dynamic_cast<B*>(pa); B*pb=

假设我们有三个类A,B和C。B是从A派生的,C是从B派生的。 现在我们有了一个指向类a对象的指针。由于多态性,它实际上可以指向所有三个类的实例


使用typeid()我可以检查指针实际引用的类型。但我试图确定它是否指向类B的任何后代。也就是说,我正在寻找某种IsDescendatof(unkownclass,baseclass)函数。在C++中有什么原因吗?

< P>使用<代码> DyrimeCase< <代码>。失败时返回空值:

B* pb = dynamic_cast<B*>(pa);
B*pb=动态广播(pa);

您可能会发现这很有帮助。

您可以通过
动态_cast(ptr)
强制转换对象,然后检查结果是否为null(不能强制转换-不是后代)。

您还可以在编译时使用模板元编程来测试这一点。如果所讨论的类没有任何虚拟函数,而
dynamic\u cast
没有虚拟函数,它甚至可以工作

template <typename D, typename B>
class is_derived_from {
   class No { };
   class Yes { No no[2]; };

   static Yes Test(B*);
   static No  Test(...);
public:
   enum { inherits = sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) };
   static bool is_derived() { return inherits; }
};
模板
类是\u派生自\u的{
第{}类;
类是{否[2];};
静态是测试(B*);
静态无试验(…);
公众:
枚举{inherits=sizeof(Test(static_cast(0)))==sizeof(Yes)};
静态bool是_派生的(){return inherits;}
};

我认为这是从一个优秀的系列中衍生出来的。

使用
std::is_base\u of
from
static\u assert
在编译时进行检查

不是完全重复的,但是已经讨论了这个确切的场景:如果您正确使用多态性,您将很少需要
dynamic\u cast()
。为什么需要这样做?只有在编译时知道指针所包含的类型时,这才有效。如果它在那里被知道,人们可能应该使用类似的东西来代替。从问题中我们不太清楚这是在编译时知道的,还是必须在运行时知道的。不过,使用boost而不是DIY解决方案是一个很好的观点。