### 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 { }

 ``123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110`` ``````#include #include #include // 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 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 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 u) const override { u->area_calc(); } }; class Unit { public: using pointer_type = shared_ptr ; 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.

 ``123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122`` `````` #include #include #include // for dynamic_cast and dynamic_pointer_cast #define PI 3.14 using namespace std; class Unit { public: using pointer_type = shared_ptr ; 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 ; double x_; double y_; Shape(double x, double y) : x_(x), y_(y) {} //virtual double area() const = 0 virtual void area(shared_ptr 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 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 u) const override { u->area_calc(); } }; int main() { Circle c1(1, 1, 2); Unit::pointer_type u = make_shared (); Shape::pointer_type s = make_shared (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.