C++ 在C++;,如何测试对象是否是父类';建造师?

C++ 在C++;,如何测试对象是否是父类';建造师?,c++,C++,我试图使用dynamic\u cast断言,如果对象是特定的子类类型,则传递到父类构造函数的指针仅为NULL: #include <iostream> class Parent { public: Parent(void *ptr); virtual ~Parent(); // to make Parent polymorphic }; class Child1 : public Parent { public: Child1() : Parent(0) {

我试图使用
dynamic\u cast
断言,如果对象是特定的子类类型,则传递到父类构造函数的指针仅为
NULL

#include <iostream>
class Parent {
public:
    Parent(void *ptr);
    virtual ~Parent(); // to make Parent polymorphic
};

class Child1 : public Parent {
public:
    Child1() : Parent(0) { std::cout << "Child1 ctor\n";};
};
class Child2 : public Parent {
public:
    Child2() : Parent(0) { std::cout << "Child2 ctor\n";};
};

Parent::Parent(void *ptr) {
    if (0 == ptr && 0 == dynamic_cast<Child1*>(this)) {
         std::cerr<<"ERROR\n";
    }
}
Parent::~Parent() {};

int main(void) {
    Child1 *c1 = new Child1();
    Child2 *c2 = new Child2();
}
然而,我只希望在
Child2
构造期间看到
ERROR


当我在
Child1
的构造函数初始化列表中调用
Child1
Parent
构造函数时,为什么
dynamic\u cast
返回非空值?另外,是否有其他方法来完成此测试?

当您在父构造函数(基类)中时,子构造函数尚未构造。因此,在父级的构造函数中,动态类型始终是父级的。

我猜问题在于动态转换在vtable之外工作,直到构造函数完成后才进行设置。因此,您不能在构造函数中调用动态_cast

如果不使用模板并使所有内容保持静态,我想不出任何直接的方法来在构造函数中检测这一点。你为什么想要这种行为?这似乎很可疑——父母真的不应该知道孩子1和孩子2的派生词


如果您想在Child2调用父构造函数时保护中的空指针,为什么不在Child2的构造函数中保护它,并在它为空时引发异常?

这样做的一种方法是在基类中创建预期的构造函数,并传递指示如何初始化它的参数-这样子类将决定它们想要它的方式,基类将根据请求安排事情。

所以RTTI信息是由每一级构造函数迭代构建的?不,RTTI信息是静态的,在编译时构建的。在构造函数和析构函数中,派生类尚未构建或已被销毁。但是,您可能会说,对象的动态类型是由每一级构造函数迭代构建的。我有一种感觉,这种设计会违反继承的“is-a”关系……1)您为什么要这样做?2) 不能这样做的原因是子类尚未构造。因为实际上,我有10个不同的子类必须具有非空指针,但只有1个子类将具有空指针。我试图避免将这个检查放在10个不同的类中。@Ross:为什么不在
Parent
中使用一个静态的helper函数呢
private:static void checkPointer(void*ptr,bool b){if(ptr==NULL&!b)std::cerr仍然违反了D.R.Y.(我知道我违反了KISS:-)),但你给了我一个不同的想法。我可以执行与我在访问器方法中编写的完全相同的检查,
动态转换将起作用。我想做这件事的原因是我可以控制
父项和
子项1
,但我无法控制所有其他
子项2
子项。有很多Child2。我试图避免将检查放在一大堆类中。为什么不创建一个CheckedParent类,并从中派生Child2?
ERROR
Child1 ctor
ERROR
Child2 ctor