Как так получается, что у внутреннего объекта при создании для базового класса вызывается обычный конструктор, а у его наследника конструктор копирования
static int i;
class A {
public:
A() : num(i) { wcout << i++ << _T("A c-tor\n"); }
A(const A&) : num(i) { wcout << i++ << _T("A copy c-tor\n"); }
~A() { wcout << num << _T("A d-tor\n"); }
int num;
};
class B : public A {
public:
B() : num(A::num) { wcout << num << _T("B c-tor\n"); }
B(const B&) : num(A::num) { wcout << num << _T("B copy c-tor\n"); }
~B() { wcout << num << _T("B d-tor\n"); }
int num;
};
int _tmain(int argc, _TCHAR* argv[])
{
try {
B b;
throw b;
} catch(A a) {
wcout << _T("In a catch\n");
} catch(B b) {
wcout << _T("In b catch\n");
}
return 0;
}
Здравствуйте, Аноним, Вы писали:
А>Как так получается, что у внутреннего объекта при создании для базового класса вызывается обычный конструктор, а у его наследника конструктор копирования
А>А>static int i;
А>class A {
А>public:
А> A() : num(i) { wcout << i++ << _T("A c-tor\n"); }
А> A(const A&) : num(i) { wcout << i++ << _T("A copy c-tor\n"); }
А> ~A() { wcout << num << _T("A d-tor\n"); }
А> int num;
А>};
А>class B : public A {
А>public:
А> B() : num(A::num) { wcout << num << _T("B c-tor\n"); }
А> B(const B&) : num(A::num) { wcout << num << _T("B copy c-tor\n"); }
А> ~B() { wcout << num << _T("B d-tor\n"); }
А> int num;
А>};
А>int _tmain(int argc, _TCHAR* argv[])
А>{
А> try {
А> B b;
А> throw b;
А> } catch(A a) {
А> wcout << _T("In a catch\n");
А> } catch(B b) {
А> wcout << _T("In b catch\n");
А> }
А> return 0;
А>}
А>
Потому-что вы его и не вызвали:
B(const B& b) : A(b), num(A::num) { wcout << num << _T("B copy c-tor\n"); }
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]