How to call base constructor where virtual functions are problem ?
Jun 29, 2017 at 4:52pm UTC
I want to call the base constructor using arguments in derived class but I must have the virtual functions inside the base.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class Iboard
{
int i;
public :
Iboard (int x){
i=x;
cout << "Constructing base1\n" ;
};
virtual ~Iboard (){};
virtual void shuffle(unsigned int steps) = 0;
virtual unsigned int getBlock( unsigned int x, unsigned int y )=0;
virtual bool MoveBlock(unsigned int x,unsigned int y)=0;
};
class Isolver
{
public :
Isolver(){};
virtual ~ Isolver(){};
virtual void x(Iboard* pboard)=0;
};
class derived:public Isolver
{
public :
void x(Iboard* Pboard)
{
}
};
int main()
{
derived obj;
Iboard b(1);
obj. x(&b);
return 0;
}
Jun 29, 2017 at 5:13pm UTC
Iboard b(1);
Iboard is an abstract class (though can't see a reason why it should be), so the program fails here. However, if you make Iboard non-abstract you could retain Isolver as abstract && provide an implementation for Isolver::x()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class Iboard
{
int i;
public :
Iboard (int x) : i(x){
// i=x;
cout << "Constructing base1\n" ;
};
virtual ~Iboard (){};
virtual void shuffle(unsigned int steps){}// = 0;
virtual unsigned int getBlock( unsigned int x, unsigned int y ){return 1;}//=0;
virtual bool MoveBlock(unsigned int x,unsigned int y){return true ;}//=0;
};
class Isolver
{
public :
Isolver(){};
virtual ~ Isolver(){};
virtual void x(Iboard* pboard)=0;
};
void Isolver::x(Iboard* pboard){std::cout << "abstract base \n" ;}
class derived:public Isolver
{
public :
void x(Iboard* Pboard)
{
Isolver::x(Pboard);
std::cout << "also derived \n" ;
}
};
int main()
{
derived obj;
Iboard b(1);
obj. x(&b);
return 0;
}
also consider const qualifiers on the member methods wherever feasible
Topic archived. No new replies allowed.