C++ C++;:是类的实例后代
假设我们有三个类A,B和C。B是从A派生的,C是从B派生的。 现在我们有了一个指向类a对象的指针。由于多态性,它实际上可以指向所有三个类的实例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=
使用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 offrom
和static\u assert
在编译时进行检查不是完全重复的,但是已经讨论了这个确切的场景:如果您正确使用多态性,您将很少需要dynamic\u cast()
。为什么需要这样做?只有在编译时知道指针所包含的类型时,这才有效。如果它在那里被知道,人们可能应该使用类似的东西来代替。从问题中我们不太清楚这是在编译时知道的,还是必须在运行时知道的。不过,使用boost而不是DIY解决方案是一个很好的观点。