Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, rg45, Вы писали:
R>>Здравствуйте, kov_serg, Вы писали:
_>>>_>>>#include <iostream>
_>>>struct A { int a; };
_>>>struct B : virtual A { int b; };
_>>>struct C : virtual A { int c; };
_>>>struct D : B,C { int d; };
_>>>template<class T> T* get_instance() { static T t[1]; return t; }
_>>>template<class T,auto m> size_t offset() {
_>>> T *t=get_instance<T>(); return (char*)&(t->*m)-(char*)t;
_>>>}
_>>>int main(int argc,char **argv) {
_>>> std::cout<< "b:" << offset<D,&D::b>() << std::endl;
_>>> std::cout<< "c:" << offset<D,&D::c>() << std::endl;
_>>> std::cout<< "d:" << offset<D,&D::d>() << std::endl;
_>>> std::cout<< "a:" << offset<D,&D::a>() << std::endl;
_>>> return 0;
_>>>}
_>>>
R>>И что ты хочешь продемонстрировать этим примером?
_>То что в C++ нет указателя &D::a вместо используется &A::a. Вот нахрена так было делать?
Ну потому что поле "a" является членом класса A. И выражение &D::a имеет тип указателя на член класса А. И указатель на член класса A без проблем может быть использован с объектом класса D, как с наследником класса A. А почему должно быть по-другому?
И вообще, какую связь ты видишь между этими вопросами и данной темой?