3 level inheritance heirarchy

I

interec

I have trying to set up a three level inheritance heirarchy (see files
test.h/cpp below). When I compile this code using g++, I get the
following errors:

bash-3.00$ g++ test.cpp
test.cpp: In constructor `Lev2::Lev2(int, int, int)':
test.cpp:33: error: no matching function for call to `Lev0::Lev0(const
void**)'
test.h:27: note: candidates are: Lev0::Lev0(const Lev0&)
test.cpp:6: note: Lev0::Lev0(int)

Can someone please explain whats going on and how I can fix this
problem. Please see code below. If I remove the classes ILev2 and Lev2
everything compiles fine. Thanks

//-------------------------- FILE: test.h --------------------------//

#include <iostream>
#include <iomanip>

class ILev0
{
public:
virtual ~ILev0() {}
virtual void PrintLev0() = 0;
};

class ILev1: public virtual ILev0
{
public:
virtual ~ILev1() {}
virtual void PrintLev1() = 0;
};

class ILev2: public virtual ILev1
{
public:
virtual ~ILev2() {}
virtual void PrintLev2() = 0;
};


class Lev0: public virtual ILev0
{
public:
Lev0(int nNum);
virtual void PrintLev0();

protected:
int m_nNum0;
};

class Lev1: public virtual Lev0, public virtual ILev1
{
public:
Lev1(int nNum0, int nNum1);
virtual void PrintLev1();
protected:
int m_nNum1;
};


class Lev2: public virtual Lev1, public virtual ILev2
{
public:
Lev2(int nNum0, int nNum1, int nNum2);
virtual void PrintLev2();
protected:
int m_nNum2;
};



//-------------------------- FILE: test.cpp ------------------------//
#include "test.h"

//-------

Lev0::Lev0(int nNum)
:m_nNum0(nNum)
{
}

void Lev0::printLev0()
{
std::cout << "Lev0 Num: " << m_nNum0 << std::endl;
}

//-------

Lev1::Lev1(int nNum0, int nNum1)
:Lev0(nNum0),
m_nNum1(nNum1)
{
}

void Lev1::printLev1()
{
std::cout << "Lev1 Num: " << m_nNum0 << ", " << m_nNum1 <<
std::endl;
}

//-------

Lev2::Lev2(int nNum0, int nNum1, int nNum2)
:Lev1(nNum0, nNum1),
m_nNum2(nNum2)
{
}

void Lev2::printLev2()
{
std::cout << "Lev2 Num: " << m_nNum0 << ", " << m_nNum1 << ", " <<
m_nNum2 << std::endl;
}


//---

main()
{
Lev0 *b = new Lev0(10);
b->PrintLev0();
}


//------------------------------------------------------------------//

Never miss a thing. Make Yahoo your homepage.
 
S

Sachin

I have trying to set up a three level inheritance heirarchy (see files
test.h/cpp below). When I compile this code using g++, I get the
following errors:

bash-3.00$ g++ test.cpp
test.cpp: In constructor `Lev2::Lev2(int, int, int)':
test.cpp:33: error: no matching function for call to `Lev0::Lev0(const
void**)'
test.h:27: note: candidates are: Lev0::Lev0(const Lev0&)
test.cpp:6: note:                 Lev0::Lev0(int)

Can someone please explain whats going on and how I can fix this
problem. Please see code below. If I remove the classes ILev2 and Lev2
everything compiles fine. Thanks

//-------------------------- FILE: test.h --------------------------//

#include <iostream>
#include <iomanip>

class ILev0
{
 public:
  virtual ~ILev0() {}
  virtual void PrintLev0() = 0;

};

class ILev1: public virtual ILev0
{
 public:
  virtual ~ILev1() {}
  virtual void PrintLev1() = 0;

};

class ILev2: public virtual ILev1
{
 public:
  virtual ~ILev2() {}
  virtual void PrintLev2() = 0;

};

class Lev0: public virtual ILev0
{
 public:
  Lev0(int nNum);
  virtual void PrintLev0();

 protected:
  int m_nNum0;

};

class Lev1: public virtual Lev0, public virtual ILev1
{
 public:
  Lev1(int nNum0, int nNum1);
  virtual void PrintLev1();
 protected:
  int m_nNum1;

};

class Lev2: public virtual Lev1, public virtual ILev2
{
 public:
  Lev2(int nNum0, int nNum1, int nNum2);
  virtual void PrintLev2();
 protected:
  int m_nNum2;

};

//-------------------------- FILE: test.cpp ------------------------//
#include "test.h"

//-------

Lev0::Lev0(int nNum)
  :m_nNum0(nNum)
{

}

void Lev0::printLev0()
{
  std::cout << "Lev0 Num: " << m_nNum0 << std::endl;

}

//-------

Lev1::Lev1(int nNum0, int nNum1)
  :Lev0(nNum0),
   m_nNum1(nNum1)
{

}

void Lev1::printLev1()
{
  std::cout << "Lev1 Num: " << m_nNum0 << ", " << m_nNum1 <<
std::endl;

}

//-------

Lev2::Lev2(int nNum0, int nNum1, int nNum2)
  :Lev1(nNum0, nNum1),
   m_nNum2(nNum2)
{

}

void Lev2::printLev2()
{
  std::cout << "Lev2 Num: " << m_nNum0 << ", " << m_nNum1 << ", " <<
m_nNum2 << std::endl;

}

//---

main()
{
  Lev0 *b = new Lev0(10);
  b->PrintLev0();

}

//------------------------------------------------------------------//

Never miss a thing. Make Yahoo your homepage.

Call to Constructor of Lev0 class is missing in the Lev2 constructor.
Resolution is to either implement default constructor in Lev0 class or
make a call to Lev0 constructor in the constructor of Lev2 as follows:
Lev2::Lev2(int nNum0, int nNum1, int nNum2)
:Lev1(nNum0, nNum1),Lev0(nNum0),
m_nNum2(nNum2)
{

}
 
I

interec

Call to Constructor of Lev0 class is missing in the Lev2 constructor.
Resolution is to either implement default constructor in Lev0 class or
make a call to Lev0 constructor in the constructor of Lev2 as follows:
Lev2::Lev2(int nNum0, int nNum1, int nNum2)
:Lev1(nNum0, nNum1),Lev0(nNum0),
m_nNum2(nNum2)
{

}

Lev2 constructor explicitly calls Lev1 constructor and Lev1
constructor explicitly calls Lev0 constructor so why do I need to add
a call to Lev0 constructor in Lev2 ?
 
T

Tadeusz B. Kopec

Lev2 constructor explicitly calls Lev1 constructor and Lev1 constructor
explicitly calls Lev0 constructor so why do I need to add a call to Lev0
constructor in Lev2 ?

Because it's a virtual base class.
 
S

Sachin

Because it's a virtual base class.

--
Tadeusz B. Kopec ([email protected])
Enzymes are things invented by biologists that explain things which
otherwise require harder thinking.
                -- Jerome Lettvin- Hide quoted text -

- Show quoted text -

I think you need to call Lev0 construcor from Lev2 constructor t0o, as
Lev0 constructor calls pror to Lev1 constructor.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top