সি ++ তে বিশুদ্ধ ভার্চুয়াল ডেস্ট্রাক্টর


163

এটা কি ভুল:

class A {
public:
    virtual ~A() = 0;
};

একটি বিমূর্ত বেস বর্গ জন্য?

কমপক্ষে এমএসভিসিতে সংকলিত ... এটি রান টাইমে ক্রাশ হবে?


9
এটি সংকলন করতে পারে, তবে এটি কি লিঙ্ক করে?
হাঁস

উত্তর:


218

হ্যাঁ. আপনি ধ্বংসকারী বাস্তবায়ন করতে হবে:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

যথেষ্ট করা উচিত

এবং যেহেতু এটি একটি ডাউন ভোট পেয়েছে, আমার স্পষ্ট করে দেওয়া উচিত: আপনি যদি এ থেকে কিছু পান এবং তা মুছতে বা নষ্ট করার চেষ্টা করেন, A অবশেষে এর ধ্বংসকারীকে ডাকা হবে। যেহেতু এটি খাঁটি এবং এর বাস্তবায়ন নেই, তাই অনির্ধারিত আচরণ দেখা দেবে। একটি জনপ্রিয় প্ল্যাটফর্মে, এটি খাঁটি কলকারী হ্যান্ডলার এবং ক্র্যাশকে অনুরোধ করবে।

সম্পাদনা করুন: http://www.comeaucomputing.com/tryitout/ এর সাথে সংকলিত, আরও ঘোষিত ঘোষণাটি স্থির করে


16
হুম, হ্যাঁ খাঁটি অর্থ একটি উদ্ভূত শ্রেণীরও একটি বাস্তবায়ন সরবরাহ করা দরকার।
এমএসএন

72
খাঁটি ভার্চুয়াল ফাংশন প্রয়োগ করা আসলে আইনী। একটি ডিফল্ট বাস্তবায়ন প্রদানের জন্য খুব উপকারী তবে সাবক্লাসগুলি এটিকে স্পষ্টভাবে কল করতে বাধ্য করে।
jmucchiello

6
এমএসএন এবং নোট করুন যদি আপনার শিরোনামে এই সংজ্ঞা থাকে তবে আপনাকে ওডিআর (একটি সংজ্ঞা বিধি) লঙ্ঘন এড়াতে "ইনলাইন" লাগাতে হবে
জোহানেস স্কাউব - লিটব

2
কেন :: :: ~ এ () স্পষ্টভাবে সংজ্ঞায়িত করতে হবে, যেহেতু, আমি ভেবেছিলাম প্রতিটি বস্তুর জন্য কোনও ডিফল্ট ডেস্ট্রাক্টর রয়েছে? যে কোনও ধরণের উত্তরাধিকার হিসাবে, সর্বদা ধ্বংসকারীদের শৃঙ্খলা বলা হয় এবং বেস শ্রেণীর ধ্বংসকারীকে সর্বদা সংজ্ঞায়িত করা হয় না।
জেফডি

11
এটি বলার আরও ভাল উপায় হ'ল একবার আপনি ডেস্ট্রাক্টর ঘোষণা করলে এটি স্বয়ংক্রিয়ভাবে আপনার জন্য প্রয়োগ করা হয় না।
এমএসএন 21

49

ব্যক্তিগত ডেস্ট্রাক্টর: আপনি যখন কোনও উদ্ভূত শ্রেণীর কোনও বস্তু তৈরি করেন তখন তারা আপনাকে একটি ত্রুটি দেবে - অন্যথায় নয়। যদিও ডায়াগনস্টিক উপস্থিত হতে পারে।

12.4 ধ্বংসকারী

6 একজন ডেস্ট্রাক্টরকে ভার্চুয়াল (10.3) বা খাঁটি ভার্চুয়াল (10.4) হিসাবে ঘোষণা করা যেতে পারে; প্রোগ্রামে যদি সেই শ্রেণি বা কোনও উত্পন্ন শ্রেণীর কোনও অবজেক্ট তৈরি করা হয় তবে ধ্বংসকারীকে সংজ্ঞায়িত করা হবে।

খাঁটি ভার্চুয়াল ডেস্ট্রাক্টর সহ একটি শ্রেণি একটি বিমূর্ত শ্রেণি। ভাল করে লক্ষ্য কর:

10.4 বিমূর্ত ক্লাস

2 একটি খাঁটি ভার্চুয়াল ফাংশন কেবল সংজ্ঞায়িত করা যেতে পারে যদি ডাকা হয়, বা যেমন (12.4), যোগ্য-আইডি সিনট্যাক্স (5.1) দিয়ে থাকে।

[ দ্রষ্টব্য : কোনও ফাংশন ঘোষণাপত্র একটি বিশুদ্ধ-নির্দিষ্টকারী এবং সংজ্ঞা সংজ্ঞা উভয়ই সরবরাহ করতে পারে না]

খসড়া থেকে সরাসরি নেওয়া:

struct C {
   virtual void f() = 0 { }; // ill-formed
};

14
+1 টি। আমি মনে করি হার্ব সটারেরও এ সম্পর্কে কিছু ভাল তথ্য রয়েছে: getw.ca/gotw/031.htm । এটি লক্ষণীয় যে আকর্ষণীয় যে কোনও খাঁটি ভার্চুয়াল ফাংশনটিতে কেবলমাত্র ধ্বংসকারীদের নয়, বাস্তবায়ন সরবরাহ করা যেতে পারে।
ফ্রেড লারসন

6
হ্যাঁ, আপনি নিজের সাক্ষাত্কারকে
ফাঁসানোর

1
আমার অভিজ্ঞতায় এটি আসলে এতটা অস্বাভাবিক নয়।

@ নীল বাটারওয়ার্থ: কোনটি?
সজ্জিতভাবে

@ ডির্ক - "যে কোনও ফাংশন" দৃশ্য। এটি কিছু সাধারণ আচরণ বাস্তবায়নের জন্য এটি ব্যবহার করা অস্বাভাবিক নয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.