کاربرد virtual در وراثت - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

کاربرد virtual در وراثت

+1 امتیاز

سلام.می خواستم بدونم virtual در وراثت چه فایده ای داره.من یه کد دارم که سه تا کلاس از هم ارث میبرند.و هرکدوم تابع f رو دارند.حالا من وقتی از هر کلاس یه شی میسازم و تابع f هر شی رو فراخوانی میکنم هم با virtual کردن تابع f کلاس والد و هم  بدون این کار تابع f همون شی فراخوانی میشه.مگه ما یه متد یا attribute روبرای این  virtual نمیکنیم که بیاد عضو همون شی رو فراخوانی کنه خب بدون virtual کردن هم که همین نتیجه رو میگیرم.

#include "stdafx.h"
#include <iostream>
using namespace std;
class B
{
public:

	void virtual f1()
	{
		cout<<"now B:f1()"<<endl;
	}
};
class C:public B
{public:
	void f1()
	{
		cout<<"now C:f1()"<<endl;
		
	}
};
class D:public C
{
public:
       void f1()
		{
	
			cout<<"now D:f1()"<<endl;
		}
};
int _tmain(int argc, _TCHAR* argv[])
{
	B x;
	C y;
	D z;
	x.f1();
	y.f1();
	z.f1();
	//khoroje ham ba virtual ham bedone an
	// now B:f1()
	//now C:f1()
	//now D:f1()
	return 0;
}

 

سوال شده فروردین 26, 1393  بوسیله ی maryam (امتیاز 338)   12 33 44

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

آره وقتی که به شکل بالا توابع virtual رو صدا میزنین خروجی یکیه

این مثال رو ببینید این جا زمانی که از virtual استفاده نشه تابع Base صدا زده میشه در حالی که باید تابع داخل Drived صدا زده بشه

#include <iostream>

using namespace std;

class Base
{
public:
    void func(){cout<<"In Base\n";}
};

class Drived:public Base
{
public:
    void func(){cout<<"In Drived\n";}
};

int main ()
{
    Base *drived=new Drived;
    drived->func();
    return 0;
}

 

ضمنا استفاده از virtual به خوانایی کد هم کمک می کنه چون با دیدن توابع به شکل Virtual میشه فهمید که داخل کلاسایی که ارث برده شده override شدن .

پاسخ داده شده فروردین 26, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد فروردین 26, 1393 بوسیله ی maryam
...