اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

چرا در c++ تابع سازنده مجازی نداریم؟

+2 امتیاز
165 نمایش
پرسیده شده یکشنبه ۲۹ اردیبهشت ۱۳۹۲ در C++ توسط CPP_Crawler4  
بازتگ شده یکشنبه ۲۹ اردیبهشت ۱۳۹۲ توسط admin

2 پاسخ

0 امتیاز

اصولا یک تابع بصورت مجازی وقتی فراخونی میشه که ما نیازی نداریم دقیقا بدونیم شیء از چه نوعیه، ولی وقتی قراره یک شیء بوجود بیاد به اطلاعات کاملی احتیاج داریم، در واقع باید بدونیم دقیقا نوع چیزی که میخوایم ایجاد کنیم چیه. پس پیاده‌سازی یک تابع سازنده نمیتونه مجازی باشه.

پاسخ داده شده یکشنبه ۲۹ اردیبهشت ۱۳۹۲ توسط CPP_Crawler5  
ویرایش شده چهارشنبه ۱ خرداد ۱۳۹۲ توسط CPP_Crawler5

این یه ترجمه‌ی تحت‌اللفظی از سایت استراستراپ نیست؟ استراستراپ خیلی کوتاه و مختصر طوری توضیح داده که فقط حرفه‌ای‌های C++ می‌تونن به سرعت متوجه بشن یعنی چی.
مثلاً در مورد این پاراگراف این سوال‌های برای همه پیش می‌آد:
۱) نیازی نداریم بدونیم شی از چه نوعیه یعنی چی؟
۲) اطلاعات کامل منظور چیه؟
۳) فراخوانی سازنده باشه یا پیاده‌سازی؟

با وجود اینکه من حرفه‌ای C++ نیستم و 90% جوابایی که میذارم ترجمه‌س، 10% تجربه و شاید دانش خودم، ولی اینو که یکبار خوندم فهمیدم منظورش چی بود اگه نه که نمیذاشتم.
خودمونیم ایرادا یکم ایراد نبود، مگه سومیش فقط که اصلاح شد. مرسی :)

خودم جوابش و می‌دم
۱) در شی‌گرایی یه شی مورد اشاره‌ی یک اشاره‌گر ممکنه از نوع اعلان شده‌ی خودش باشه (نوع‌دهی ایستا مثل class_A *obj = new class_A()) یا از نوع فرزندش (نوع‌دهی پویا مثل class_A *obj = new class_B()). در کلاس‌هایی که بدون فرزند و والد هستند این اتفاق نمی‌افته. بنابراین این قسمت که استراستراپ خیلی مختصر بیان کرده به سرعت قابل تشخیص نیست.
۲) این که اطلاعات کامل برای به وجود اومدن شی لازمه یعنی هنگامی که یک شی تعریف می‌شه (نه اعلان) دقیقاً باید بدونیم مقداردهی‌های اولیه‌ی اعضای اون شی چطوره و نوع دقیقش چیه. این در حالت نوع‌دهی ایستا که مشخصه و در حالت نوع‌دهی پویا هم اطلاعات اولیه برای ساخته شدن شی مربوط به شی مورد اشاره‌ست موقع تعریف نه موقع اعلان. یعنی class_A *obj = new class_B() نوع class_B رو برای اشاره‌گر در نظر می‌گیره و بنابراین سازنده همیشه مشخصه.

0 امتیاز

تابع مجازی برای استفاده از خاصیت نوع‌دهی پویا استفاده می‌شه که یه اشاره‌گر از نوع والد به شی از نوع فرزند اشاره می‌کنه. در اون حالت مجازی بودن یه تابع معنی داره
برای توضیح بیشتر اینجا رو ببینید

اما در مورد سازنده‌ها همچین حالتی رو اصلاً نداریم و سازنده هنگامی که اجرا می‌شه نوعش به صورت ایستا مشخصه. بنابراین سازنده‌ی مجازی معنی نداره.

مثلاً فرض کنیم کد زیر و برای نوع ایستا داریم

class Shape
{
  Shape(){ ... }
};
class Rectangle : public Shape
{
  Rectangle(){ ... }
};

void main()
{
  Shape *S  = new Shape();
  Rectangle *R = new Rectanlge();
}

در این صورت مشخص که برای R باید سازنده‌ی Rectanlge فراخوانی بشه و برای S سازنده‌ی Shape.

حالا کد زیر و در نظر بگیریم که نوع‌دهی پویا داره

Shape *S = new Rectangle();

در این حالت هم که نوع‌دهی پویاست اما مشخصه که باید سازنده‌ی Rectangle فراخوانی بشه نه Shape.

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده دوشنبه ۳۰ اردیبهشت ۱۳۹۲ توسط prodo  
ویرایش شده پنجشنبه ۲ خرداد ۱۳۹۲ توسط prodo

لطفا لینک رو اصلاح کنید. مرسی.

مرسی اصلاح شد