Наследование C++....!
Вопрос на засыпку: почему при множественном наследовании некоторые базовые классы имеют один this, а некоторые другой?
Пример:
#include <stdio.h>
class A
{
public:
virtual int a();
};
int A::a()
{
printf("A %i\n",this);
}
class B : virtual A
{
public:
int a();
};
int B::a()
{
printf("B %i\n",this);
}
class C : virtual A
{
public:
int a();
};
int C::a()
{
printf("C %i\n",this);
}
class D : B, C
{
public:
int a();
};
int D::a()
{
A::a();
B::a();
C::a();
printf("D %i\n",this);
}
int main()
{
D d;
d.a();
return 0;
}
Получается:
A <this>
B <this>
C <другой указатель>
D <this>
Цитата:
Originally posted by Elf
Здрасте все!
Вопрос на засыпку: почему при множественном наследовании некоторые базовые классы имеют один this, а некоторые другой?
Пример:
#include <stdio.h>
class A
{
public:
virtual int a();
};
int A::a()
{
printf("A %i\n",this);
}
class B : virtual A
{
public:
int a();
};
int B::a()
{
printf("B %i\n",this);
}
class C : virtual A
{
public:
int a();
};
int C::a()
{
printf("C %i\n",this);
}
class D : B, C
{
public:
int a();
};
int D::a()
{
A::a();
B::a();
C::a();
printf("D %i\n",this);
}
int main()
{
D d;
d.a();
return 0;
}
Получается:
A <this>
B <this>
C <другой указатель>
D <this>
Здрасте все!
Вопрос на засыпку: почему при множественном наследовании некоторые базовые классы имеют один this, а некоторые другой?
Пример:
#include <stdio.h>
class A
{
public:
virtual int a();
};
int A::a()
{
printf("A %i\n",this);
}
class B : virtual A
{
public:
int a();
};
int B::a()
{
printf("B %i\n",this);
}
class C : virtual A
{
public:
int a();
};
int C::a()
{
printf("C %i\n",this);
}
class D : B, C
{
public:
int a();
};
int D::a()
{
A::a();
B::a();
C::a();
printf("D %i\n",this);
}
int main()
{
D d;
d.a();
return 0;
}
Получается:
A <this>
B <this>
C <другой указатель>
D <this>
Вся мулька в описании класса D. Ты два раза перекрываешь класс A и естественно что, класс C имеет другой this (который он ролучает при создании объекта). Иначе ты получишь циклические перекресные ссылки и не сможешь разрешить неопределенность при вызове метода a().
PS Чтобы понятнее:
Если расписать последовательность конструкторов про создании класса D, то получается следующее:
{ {new C {new A = this1}C = this1}D = this1,{ new B {new A = this2}B = this2}D=this2};
PPS А вообще то такие вопросы лучше задавать в форуме по общим вопросам программирования. Непосредственно к Билдеру это имеет мало отношения.