How to call base constructor where virtual functions are problem ?

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;
}
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.