subclassing
От: SETA  
Дата: 15.04.03 16:35
Оценка:
template <typename Subclass> struct B1 {
  int f1() { return (*reinterpret_cast<Subclass*>(this)).i_; }
};

template <typename Subclass> struct B2 {
  int f2() { return (*reinterpret_cast<Subclass*>(this)).i_; }
};

template
<
  template <class> class Baseclass1 = B1,
  template <class> class Baseclass2 = B2
>
class Foo : public Baseclass1<Foo<> >, public Baseclass2<Foo<> >
{
public:
  Foo() : i_(123) {}
  int i_;
};


Почему в vc7 только функции первого шаблонного параметра (f1) находят адреса отктрытых членов (i_) класса Foo?
... << RSDN@Home 1.0 beta 6a >>
Re: subclassing
От: Павел Кузнецов  
Дата: 15.04.03 16:44
Оценка: 8 (1)
Здравствуйте, SETA, Вы писали:

S>
S> template <typename Subclass> struct B1 {
S>   int f1() { return (*reinterpret_cast<Subclass*>(this)).i_; }
S> };

S> template <typename Subclass> struct B2 {
S>   int f2() { return (*reinterpret_cast<Subclass*>(this)).i_; }
S> };
S>


При множественном наследовании адреса не всех подобъектов равны адресу
полного объекта. Вместо reinterpret_cast используй static_cast.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: subclassing
От: TepMuHyc  
Дата: 15.04.03 16:50
Оценка:
Здравствуйте, SETA, Вы писали:

SET>  int f1() { return (*reinterpret_cast<Subclass*>(this)).i_; }

Здесь нужен static_cast, а то будут проблемы.


SET>class Foo : public Baseclass1<Foo<> >, public Baseclass2<Foo<> >

Если ты хочешь чтобы у тебя действительно был сабклассинг, то убери "<>" от Foo
— т.к. "Foo<>" означает инстанциацию шаблона с набором шаблонных аргументов по умолчанию.
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.