PDA

View Full Version : virtual & cast



shaaadi
شنبه 29 خرداد 1389, 17:03 عصر
//#include "stdafx.h"
#include "iostream"
#include "iomanip"
using namespace std;


class A {
public:
virtual void f() const =0;
void g() const {};
};

class B : public A {
public:
B( int = 0, int = 0 );
virtual void f() const { cout << "B: "; }
void g() const ;
private:
int x, y;
};

class C : public B {
public:
C( double r2 = 0.0, int x = 0, int y = 0 );

virtual void f() const { cout << "C: "; }
void g() const;
private:
double r;
};

B::B( int a, int b ) { x=a; y=b; }

void B::g() const
{ cout << '[' << x << ", " << y << ']'; }

C::C( double r2, int a, int b )
: B( a, b ) // call base-class constructor
{ r= r2 ; }


void C::g() const
{
B::g();
cout << "; R = " << r;
}

void main()
{
B x( 2, 6 );
C y( 1, 30, 40 );

x.f();
x.g(); cout << '\n';

y.f();
y.g(); cout << '\n';

A *arrayOfObjects[ 3 ];
arrayOfObjects[ 0 ] = &y;
arrayOfObjects[ 1 ] = &x;
arrayOfObjects[ 2 ] = (B*)&y;

for ( int i = 0; i < 3; i++ )
{
cout << "1" << endl;
arrayOfObjects[ i ]->f();
cout << "2" << endl;
arrayOfObjects[ i ]->g();
}

int x2;
cin >> x2;
}




این یه برنامه ی سادست برای کار با virtual ... که یه ارایه از *A ساخته ... اما نمی دونم چرا عنصر سوم آرایه که cast شده به *B اما باز هم مثل *C عمل میکنه و در واقع f ای که در C هست صدا زده میشه ؟

shaaadi
شنبه 29 خرداد 1389, 18:29 عصر
خیلی خیلی ممنون از جوابتون و وقتی که گذاشتید ...
نمی دونم درست فهمیدم یا نه ... یعنی این کستی که می کنیم فقط بازه ی دید پوینتر رو عوض می کنه ؟ ماهیتش عوض نمی شه ؟
یعنی انگار که تابع مناسب (virtual) قبل از کست انتخاب شده و حالا با کست به جای 20 بایت 4 بایت دیده می شه ؟