dynamic_cast
を使用して
特定子クラス型である場合、親クラスのコンストラクタに渡されたポインタが唯一の
NULL
であることを主張しようとしている
:C++では、オブジェクトがParentクラスのコンストラクタ内のChildクラスのインスタンスであるかどうかをどのようにテストできますか?
#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();
}
この版画:
ERROR
Child1 ctor
ERROR
Child2 ctor
Child2
の建設中にERROR
が表示されると予想します。です。私はChild1
のコンストラクタの初期化リストから呼び出さChild1
ためParent
コンストラクタにいるとき
はなぜdynamic_cast
は非NULLを返していますか?また、このテストを行うには別の方法がありますか?
私は、このようなデザインが継承の "is-a"関係に違反すると感じています... –
1)なぜあなたはこれをしたいですか? 2)あなたがこれを行うことができない理由は、子どもがまだ構築されていないからです。 –
実際には、NULLポインタを持たない10個の異なる子クラスがありますが、NULLポインタを持つ1個の子クラスしかありません。私はこのチェックを10種類のクラスに入れないようにしています。 –