Страниц: [1]
  Печать  
Автор Тема: Виртуальное наследование  (Прочитано 5101 раз)
Wlad
Участник
*
Offline Offline

Сообщений: 3


Просмотр профиля
« : Мая 24, 2005, 02:25:30 pm »

Неожиданно выяснилось, что g++ требует явного вызова конструктора класса, находящегося в верхней вершине ромба наследования в классах-наследниках, находящихся в средних и нижних вершинах...

то есть, примерно вот так:

#include <string.h>
#include <ostream.h>

class A
{public:
  int sid;int id;
  A(int a_sid, int a_id): sid(a_sid),id(a_id)
  {cout << "A():" << " " << sid << " " << id << endl;};
  ~A()
  {cout << "~A():" << " " << sid << " " << id << endl;};
};

////////////////////////////////////////////////////////////////////////////////
class B : public virtual A
{public:
  char* name;

  B(char*a_name, int a_sid, int a_id) : A(a_sid,a_id), name(strdup(a_name))
  {cout << "B():" << " " << name << " " << sid << " " << id << endl; id = 100;};
  ~B(void)
  {cout << "~B():" << " " << name << " " << sid << " " << id << endl;
  if(name) delete[] name;};
};


////////////////////////////////////////////////////////////////////////////////
class A1 : public B
{public:
  int bb;

  A1(char*a_name,int a_sid,int a_id) : A(a_sid,a_id), B(a_name,a_sid,a_id),bb(200)
  {cout << "A1():" << " " << name << " " << sid << " " << id << endl;};
  ~A1()
  {cout << "~A1():" << " " << name << " " << sid << " " << id << bb << endl;};
};

////////////////////////////////////////////////////////////////////////////////
class A2 : public B
{public:
  int bb;
  A2(char*a_name,int a_sid,int a_id) : A(a_sid,a_id), B(a_name,a_sid,a_id),bb(300)
  {cout << "A2():" << " " << name << " " << sid << " " << id << endl;};
  ~A2()
  {cout << "~A2():" << " " << name << " " << sid << " " << id << bb << endl;};
};


////////////////////////////////////////////////////////////////////////////////
class C : public A1, public A2
{public:
  C(char*a_name,int a_sid,int a_id) : A(a_sid,a_id), A1("<A1>",11,12), A2("<A2>",21,22) {};
};

int main (void)
{
  C("CCC", 31, 32);
}

неудовольствие сомпилятора вызывает удаление выделенных фрагментов кода... что повергает в тихую грусть... :о)
Записан
Страниц: [1]
  Печать  
 
Перейти в: