Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Наследование C++....!

2.0K
26 января 2005 года
Elf
19 / / 11.12.2002
Здрасте все!

Вопрос на засыпку: почему при множественном наследовании некоторые базовые классы имеют один 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>
259
26 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
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>


Вся мулька в описании класса 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 А вообще то такие вопросы лучше задавать в форуме по общим вопросам программирования. Непосредственно к Билдеру это имеет мало отношения.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог