how to run a polymorphic function within a polymorphic function ie doubledispatch

I am trying to call a polymorphic function area_calc() within a polymorphic function area(). For some reason I am getting type Identifer Unit is not defined for the line :

virtual void area(shared_ptr<Unit> u) const { }



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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <cmath>
#include <memory>  // for dynamic_cast and dynamic_pointer_cast 

#define PI 3.14

using namespace std;

class Shape {

public: 

	double x_;
	double y_;

	Shape(double x, double y) : x_(x), y_(y) {}

	//virtual double area() const = 0

	virtual void area(shared_ptr<Unit>  u) const {  }


	//virtual ~Shape() = default;

	void getlocation()
	{
		cout << " x: " << x_ << "y: " << y_ << endl;
	}


};

class Circle : Shape {

public:

	double x, y, r;
	Circle(double x, double y, double r) : Shape(x, y), r(r) {}


	void  area(shared_ptr<Unit> u) const override 
	{
		
		u-> area_calc();

	
	}
};


class Line : Shape {
	double x_, y_ ;
	Line(double x, double y,double x2, double y2) : Shape(x, y) , x_(x2) , y_(y2) {}
	
	void  area(shared_ptr<Unit> u) const override
	{

		u->area_calc();


	}

};



class  Unit {

public:

	using pointer_type = shared_ptr <Unit>; 

	virtual string area_calc() { return ""; }
};



class displayInt : public Unit {


public:

	string area_calc()
	{
		return "display int"; 
	}


};


class displaydouble : public Unit {

public:

	string area_calc()
	{
		return "display double";
	}

};



int main()
{
  cout << "test<< endl; 

}
 
There is word Unit on line 20. What is it? Where within lines 1-19 was it defined?
Last edited on
its defined at line 67 - 74.
The name Unit needs to be declared before its first use.

P.S.:
Multiple (or "double") dispatch is different than what's going on here.

Multimethods:
https://en.wikipedia.org/wiki/Multiple_dispatch

C++ provides unusually powerful static multiple dispatch, but that's called overload resolution.
Last edited on

okay , I have moved the classes to the top, however I am getting an error at the line :

Shape::pointer_type s = make_shared <Circle>(Circle(1,1,2));


no suitable user defined conversion from Shape::pointer_type to shared_ptr<Circle> exists,

I am not sure why I get this error, I am using the base Shape class to make shared pointer pointing to the derived class Circle.


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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122

#include <iostream>
#include <cmath>
#include <memory>  // for dynamic_cast and dynamic_pointer_cast 

#define PI 3.14

using namespace std;


class  Unit {

public:

	using pointer_type = shared_ptr <Unit>;

	virtual string area_calc() { return ""; }
};



class displayInt : public Unit {


public:

	string area_calc()
	{
		return "display int";
	}


};


class displaydouble : public Unit {

public:

	string area_calc()
	{
		return "display double";
	}

};




class Shape {

public: 

	using pointer_type = shared_ptr <Shape>;

	double x_;
	double y_;

	Shape(double x, double y) : x_(x), y_(y) {}

	//virtual double area() const = 0

	virtual void area(shared_ptr<Unit>  u) const {  }


	//virtual ~Shape() = default;

	void getlocation()
	{
		cout << " x: " << x_ << "y: " << y_ << endl;
	}


};

class Circle : Shape {

public:

	

	double x, y, r;
	Circle(double x, double y, double r) : Shape(x, y), r(r) {}


	void  area(shared_ptr<Unit> u) const override 
	{
		
		u-> area_calc();

	
	}
};


class Line : Shape {
	double x_, y_ ;
	Line(double x, double y,double x2, double y2) : Shape(x, y) , x_(x2) , y_(y2) {}
	
	void  area(shared_ptr<Unit> u) const override
	{

		u->area_calc();


	}

};



int main()
{
	Circle c1(1, 1, 2);

	Unit::pointer_type u = make_shared <displayInt> (); 
	
	Shape::pointer_type s = make_shared <Circle>(Circle(1,1,2)); 


}
Shape::pointer_type s = make_shared <Circle>(1,1,2);
still getting this error.

Severity Code Description Project File Line Suppression State
Error C2440 'initializing': cannot convert from 'std::shared_ptr<Circle>' to 'std::shared_ptr<Shape>'
Try changing the code to
class Circle : public Shape {
Last edited on
You did not use public for all derived classes.

class Circle : Shape { // missing public
isn't double dispatch mean running a polymorphic function inside a polymorphic function ?
Topic archived. No new replies allowed.