Это нормально, если вы пройдете «это» или «это», как вы это делаете.
Lifetime Опасность:
Один пункт о примере вы поставка, что вы звоните doSth
из конструктора ClassA
. Объект, который передается doSth
, возможно, частично построенный объект:
class ClassC {
public:
ClassC()
: m_c()
{}
int m_c;
};
class ClassA : public ClassC {
public:
ClassA (ClassB & b)
: ClassC()
, m_b (b.doSth (this)) // ClassC constructed
// ClassA members partially init.
{
b.doSth (this); // ClassA members initialized
}
// ...
int m_a;
};
class ClassD : public ClassA {
public:
ClassD(ClassB & b)
: ClassA (b) // Partially init
, m_d()
{
// ClassC and ClassA constructed
// ClassD members initialized
}
int m_d;
};
Там могут быть проблемы, если doSth
использует члены, которые еще не были инициализированы:
void ClassB::doSth (ClassA * a) {
int i = a->m_c; // OK m_c is initialized
int j = a->m_a; // Not OK, m_a not initialized when called
// from member initialization list.
int k = static_cast<ClassD*> (a).m_d; // Not OK
}
Использование динамического типа объекта :
Наконец, любое использование динамического типа объекта (например, виртуальных вызовов, dynamic_cast, typeid) будет иметь разные результаты на partiall y, а не на полном объекте (и в некоторых случаях вы можете иметь неопределенное поведение).
void ClassB::doSth (ClassA * a) {
if (ClassD * d = dynamic_cast<ClassD *> (a))
{
// Never true when called from ClassA::ClassA
}
}
Когда вы «себя» в этом комментарии, вы имеете в виду объект ClassA или объект ClassB? – Stobor
В чем ваш вопрос? Что вы ожидаете и что получаете? – fserb
У вас есть вопрос, или вы просто делились? –