Вижуал, как я понимаю, помещает указатель на табл. вирт. функций в начало объекта . То есть указатель на объект есть по сути указатель на указатель. Если я наследую нсколько классов, то независимо от того, в каком порядке я ставлю классы в списке наследования (может я это и неправильно назвал, но д.б. понятно) базовые классы с виртуальными функциями идут первыми, а неполиморфные классы пихаются в конец.
Но вот что-то у меня в гцц все не так. Сначала идут данные, а указатель где-то позади. ПОЧЕМУ ТАК?
Здравствуйте Fiend, Вы писали:
F>Но вот что-то у меня в гцц все не так. Сначала идут данные, а указатель где-то позади. ПОЧЕМУ ТАК?
Потому что реализация может ракладывать не POD класс почти как захочет, полагаться на это нельзя. А чем подход gcc (если я правильно понял) не устраивает?
Если надо чтобы указатель на таблицу виртуальных функций был вначале, то надо завести абстактный базовый класс, как делается в COM. Хотя даже в этом случае Стандарт ничего не гарантирует.
Здравствуйте Fiend, Вы писали:
F>Вижуал, как я понимаю, помещает указатель на табл. вирт. функций в начало объекта . То есть указатель на объект есть по сути указатель на указатель. Если я наследую нсколько классов, то независимо от того, в каком порядке я ставлю классы в списке наследования (может я это и неправильно назвал, но д.б. понятно) базовые классы с виртуальными функциями идут первыми, а неполиморфные классы пихаются в конец.
Нет. При множественном наследовании базовые классы располагаются внутри класса-наследника в том порядке, к котором они указаны в списке наследования. Потому при множественном наследовании в классе-наследнике кроме его собственного указателя на VMT (это действительно помещается в начало объекта) может сидеть еще несколько указателей на VMT (базовых классов). Эти дополнительные указатели на VMT могут быть раскиданы по классу-наследнику как угодно.
F>Но вот что-то у меня в гцц все не так. Сначала идут данные, а указатель где-то позади. ПОЧЕМУ ТАК?
Потому что так захотелось GCC. Куда поместить указатель на VMT в классе — личное дело компилятора.
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Здравствуйте Fiend, Вы писали:
F>>Вижуал, как я понимаю, помещает указатель на табл. вирт. функций в начало объекта . То есть указатель на объект есть по сути указатель на указатель. Если я наследую нсколько классов, то независимо от того, в каком порядке я ставлю классы в списке наследования (может я это и неправильно назвал, но д.б. понятно) базовые классы с виртуальными функциями идут первыми, а неполиморфные классы пихаются в конец.
АТ>Нет. При множественном наследовании базовые классы располагаются внутри класса-наследника в том порядке, к котором они указаны в списке наследования. Потому при множественном наследовании в классе-наследнике кроме его собственного указателя на VMT (это действительно помещается в начало объекта) может сидеть еще несколько указателей на VMT (базовых классов). Эти дополнительные указатели на VMT могут быть раскиданы по классу-наследнику как угодно.
Нет, тут я с Вами не согласен. Я проверял.
class A{public:
virtual void Nothing()const{}
int k;
};
class B{public:
int n;
};
class C:public B, public A{};
int main(){
C c;
A * pa = &c;
std::cout<<pa<<" "<<&c<<" "<<&c.n<<" "<<&c.k<<std::endl;
return 0;
}
В вижуале у меня получается, что сначала идет А, а не B.
F>>Но вот что-то у меня в гцц все не так. Сначала идут данные, а указатель где-то позади. ПОЧЕМУ ТАК?
АТ>Потому что так захотелось GCC. Куда поместить указатель на VMT в классе — личное дело компилятора.