Следующий код не компилируется на g++ 4.6.1:
template<class Base>
struct GetBase {
Base * getBase() {
return static_cast<Base *>(this);
}
};
template<class Derived>
struct Parent : private GetBase<Derived> {
using GetBase<Derived>::getBase;
int y() {
return getBase()->x();
}
};
struct Child : public Parent<Child> {
int x() {
return 5;
}
int z() {
return y();
}
};
с ошибкой
In member function ‘Base* GetBase<Base>::getBase() [with Base = Child]’:
instantiated from ‘int Parent<Derived>::y() [with Derived = Child]’
instantiated from here
error: ‘GetBase<Child>’ is an inaccessible base of ‘Child’
Изменение static_cast на reinterpret_cast приведет к компиляции кода, и в этом случае он будет работать, но мне интересно, является ли это приемлемым решением во всех случаях? т. е. бывает ли так, что указатель на базовый класс не совпадает с этим? Я предполагаю, что при множественном наследовании это может произойти, если у родителей есть элементы данных? Если GetBase является первым суперклассом, гарантируется ли равенство указателей this?
getBase()
и предпочтитеdynamic_cast
для определения производного от указателя базового класса. - person AJG85   schedule 24.01.2012dynamic_cast
противоречит цели дизайна. - person templatetypedef   schedule 24.01.2012