سلام!
در این مبحث می خواهیم یک قابلیت بسیار کاربردی را برای کلاس ها (و وراثت) آموزش دهیم. فرض کنید کدی مانند کد زیر را نوشته اید. این کد چیز خاصّی ندارد. یک کلاس Shape هست با دو وارث با نام های Square و Circle. کلاس Shape یک string دارد به نام type که در آن نوع شکل ذخیره می شود.
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
class Shape{
protected:
string _type;
public:
Shape( string type = "Shape" ) : _type( type ) {}
string type();
void setType( string = "" );
string area();
};
string Shape::type(){
return this->_type;
}
void Shape::setType( string type ){
this->_type = type;
}
string Shape::area(){
return "not defined";
}
class Square : public Shape{
protected:
double _width;
public:
Square( double width = 0 ) : _width( width ) , Shape( "Square" ) {}
double width();
void setWidth( double = 0 );
double area();
};
double Square::width(){
return this->_width;
}
void Square::setWidth( double width ){
this->_width = width;
}
double Square::area(){
return pow( this->width(), 2 );
}
class Circle : public Shape{
protected:
double _radius;
public:
Circle( double radius = 0 ) : _radius( radius ), Shape( "Circle" ) {}
double radius();
void setRadius( double = 0 );
double area();
};
double Circle::radius(){
return this->_radius;
}
void Circle::setRadius( double radius ){
this->_radius = radius;
}
double Circle::area(){
return pow( this->radius(), 2) * acos( -1 );
}
int main(){
Circle circle( 10 );
Square square( 10 );
Shape shape;
cout << "I am a " << circle.type() << " and my area is " << circle.area() << endl;
cout << "I am a " << square.type() << " and my area is " << square.area() << endl;
cout << "I am a " << shape.type() << " and my area is " << shape.area() << endl;
return 0;
}
حالا یک اشاره گر با نوع کلاس Shape می سازیم و آدرس آن را برابر با آدرس یک Object از Square قرار می دهیم، یعنی
Shape *shape = □