class A
{
public:
int a;
public:
void aa(){};
};
class B
: virtual public A
{
public:
int b;
public:
void bb(){};
};
class C
: virtual public A
{
public:
int c;
public:
void cc(){};
};
class D
: public B
, public C
{
public:
int d;
public:
void dd(){};
};
void main()
{
D d;
d.a = 1;
d.b = 2;
d.c = 3;
d.d = 4;
d.aa();
d.bb();
d.cc();
d.dd();
}
Вопрос: вот в main я начал работать с классом у которого есть виртуальное наследование, сетапить мемберы, вызывать функции.
какойто оверхед на эти вызовы наложило виртуальное наследование?
IRO>какойто оверхед на эти вызовы наложило виртуальное наследование?
никакое. просто сетапя D::B::A.a и D::C::A.a компилятор приходит к одному и тому же месту в памяти.
никаких виртуальных таблиц и тому подобных фич — не используется
Здравствуйте, IROV.., Вы писали:
IRO>какойто оверхед на эти вызовы наложило виртуальное наследование?
на эти никакой. Доступ к А из Б и Ц будет с оверхедом
Re[2]: накладные расходы на виртуальное наследование
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, IROV.., Вы писали:
IRO>>какойто оверхед на эти вызовы наложило виртуальное наследование? А>на эти никакой. Доступ к А из Б и Ц будет с оверхедом
Как понять доступ, можно пример?
я не волшебник, я только учусь!
Re[3]: накладные расходы на виртуальное наследование
Здравствуйте, Programador, Вы писали:
P>Здравствуйте, IROV.., Вы писали:
IRO>>Как понять доступ, можно пример?
P>
P>void B:bb()
P>{ A::a=0;
P>}
P>Смещение A::this к B::this может отличаться от A::this к D::B::this а код B:bb() общий
ок но это же не динамическое смещение? почему компилятор не может сделать
this_A
this_BCD
хорошо а между BCD накладных расходов нет?
я не волшебник, я только учусь!
Re[5]: накладные расходы на виртуальное наследование
Здравствуйте, IROV.., Вы писали:
IRO>хорошо а между BCD накладных расходов нет?
B знает C и D во время компиляции, а А они не знают все. Б может быть чистый Б или Б в составе какогото пятого Ж, который в другом исходнике и наследует А еще и через Ё.
Re[6]: накладные расходы на виртуальное наследование
Здравствуйте, Programador, Вы писали:
P>B знает C и D во время компиляции, а А они не знают все. Б может быть чистый Б или Б в составе какогото пятого Ж, который в другом исходнике и наследует А еще и через Ё.