خیلی خلاصه: هیچوقت از متدهای virtual در سازنده و نابودگر کلاس استفاده نکنید. در سی شارپ و جاوا استفاده از این نوع متدها مشکلی ایجاد نمیکند. اما در C++ متدهای virtual در سازنده و نابودگر کلاس نادیده گرفته شده و حتی در کلاسهای مشتق شده نیز متدهای کلاس پایه صدا زده می شوند.
مثال:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ |
class base { public: base() { init(); } virtual void init() { cout<<"base"; } } class derived: public base { public: derived(): base() { } virtual void init() { cout<<"derived"; } } void f() { derived d; } |
در این مثال با فراخوانی سازنده کلاس derived در واقع انتظار داریم که روی صفحه عبارت derived نوشته شود، در صورتیکه در واقعیت عبارت base به نمایش خواهد آمد.
توضیحات بیشتر