আমি যতদূর বুঝতে পেরেছি, override
সি ++ 11 এ কীওয়ার্ডের প্রবর্তনটি ফাংশনটি বাস্তবায়িত হচ্ছে তা বেস ক্লাসে override
কোনও virtual
ফাংশনটির অন্তর্ভুক্ত কিনা তা নিশ্চিত করার জন্য এটি পরীক্ষা করা ছাড়া আর কিছুই নয় ।
এইটাই কি সেইটা?
আমি যতদূর বুঝতে পেরেছি, override
সি ++ 11 এ কীওয়ার্ডের প্রবর্তনটি ফাংশনটি বাস্তবায়িত হচ্ছে তা বেস ক্লাসে override
কোনও virtual
ফাংশনটির অন্তর্ভুক্ত কিনা তা নিশ্চিত করার জন্য এটি পরীক্ষা করা ছাড়া আর কিছুই নয় ।
এইটাই কি সেইটা?
উত্তর:
এটা আসলে ধারণা। মুল বক্তব্যটি হ'ল আপনি কী বোঝাতে চাইছেন তা সম্পর্কে আপনি স্পষ্ট, যাতে অন্যথায় নীরব ত্রুটি ধরা পড়ে:
struct Base
{
virtual int foo() const;
};
struct Derived : Base
{
virtual int foo() // whoops!
{
// ...
}
};
উপরের কোডটি সংকলন করে তবে আপনি যা বোঝাতে চেয়েছিলেন তা নয় (অনুপস্থিত নোট করুন const
)। আপনি যদি এর পরিবর্তে বলেছিলেন virtual int foo() override
, তবে আপনি একটি সংকলক ত্রুটি পাবেন যে আপনার ফাংশন আসলে কোনও কিছুই ওভাররাইড করছে না।
override
বৈশিষ্ট্যটি "স্থির করে" দেওয়ার পরামর্শ দিলে এটি একটি লাল রঙের হেরিংয়ের কিছুটা ; আপনাকে এটির const
explicit
ক্লাস সংজ্ঞাগুলি এটি সি ++ 11 এ তৈরি করে নি। হাহ।
explicit
ক্লাস সংজ্ঞাটি কী করবে ? মোটেই শুনিনি।
override
যখন কেউ এটি করার ইচ্ছা করে) তবে কর্নারের কেসগুলি মনে রাখার চেয়ে বেশি সম্ভাবনা থাকে যেমন বিভিন্ন প্রোটোটাইপের ফাংশন অনুলিপি করার ক্ষেত্রে কোনও সাধারণতা নেই, কেবল অনুপস্থিতি const
বা char
পরিবর্তে লেখার মতো অনিয়ম int
ইত্যাদি
উইকিপিডিয়া উদ্ধৃতি:
ওভাররাইড বিশেষ শনাক্তকারীটির অর্থ হ'ল সংকলকটি এই সঠিক স্বাক্ষর সহ ভার্চুয়াল ফাংশন আছে কিনা তা দেখতে বেস ক্লাসটি (এস) পরীক্ষা করবে। এবং যদি না থাকে তবে সংকলকটি ত্রুটিযুক্ত হবে।
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
সম্পাদনা করুন (উত্তরটি কিছুটা উন্নত করার চেষ্টা করছেন):
কোনও পদ্ধতিকে "ওভাররাইড" হিসাবে ঘোষণার অর্থ এই পদ্ধতিটি বেস ক্লাসে একটি (ভার্চুয়াল) পদ্ধতি পুনর্লিখনের উদ্দেশ্যে তৈরি । ওভাররাইডিং পদ্ধতিতে পুনরায় লেখার জন্য যে পদ্ধতিটি তৈরি করা হয়েছে তার মতো একই স্বাক্ষর থাকতে হবে (কমপক্ষে ইনপুট পরামিতির জন্য)।
কেন এটি প্রয়োজনীয়? ঠিক আছে, নিম্নলিখিত দুটি সাধারণ ত্রুটিগুলি প্রতিরোধ করা হয়েছে:
একটি নতুন পদ্ধতিতে একটি টাইপ করে ভুল টাইপ করে। সংকলক, অবগত নয় যে এটি পূর্বের পদ্ধতিটি লেখার ইচ্ছা করছে, কেবল এটি ক্লাসে একটি নতুন পদ্ধতি হিসাবে যুক্ত করেছে। সমস্যাটি হ'ল পুরাতন পদ্ধতিটি এখনও রয়েছে, নতুনটি কেবল একটি ওভারলোড হিসাবে যুক্ত করা হয়েছে। এক্ষেত্রে, পুরানো পদ্ধতির দিকে সমস্ত কলগুলি আচরণের কোনও পরিবর্তন ছাড়াই পূর্বের ঠিক ঠিক মতো কাজ করবে (যা পুনরায় লেখার খুব উদ্দেশ্য ছিল)।
একজন সুপারক্লাসে পদ্ধতিটিকে "ভার্চুয়াল" হিসাবে ঘোষণা করতে ভুলে যায় তবে এখনও একটি সাবক্লাসে এটি পুনরায় লেখার চেষ্টা করে। এটি আপাতদৃষ্টিতে স্বীকৃত হয়ে উঠবে, আচরণটি যেমন ঠিক তেমন উদ্দেশ্য অনুসারে হবে না: পদ্ধতিটি ভার্চুয়াল নয়, সুতরাং সুপারক্লাসের দিকে পয়েন্টারগুলির মাধ্যমে অ্যাক্সেস নতুন (সাবক্লাস) পদ্ধতির পরিবর্তে পুরাতন (সুপারক্লাস ') পদ্ধতিটিকে কল করে।
"ওভাররাইড" যুক্ত করা স্পষ্টতই এটিকে ছত্রভঙ্গ করে: এর মাধ্যমে, কেউ সংকলককে বলছেন যে তিনটি জিনিস প্রত্যাশা করছে:
এর মধ্যে যদি কোনওটি মিথ্যা হয়, তবে একটি ত্রুটি সংকেত দেওয়া হয়।
* দ্রষ্টব্য: আউটপুট প্যারামিটার কখনও কখনও পৃথক, তবে সম্পর্কিত ধরণের হয়। আগ্রহী হলে কোভেরিয়েন্ট এবং বৈষম্যমূলক রূপান্তরগুলি সম্পর্কে পড়ুন।
যখন কেউ বেস ক্লাস ভার্চুয়াল পদ্ধতির স্বাক্ষর যেমন alচ্ছিক প্যারামিটার যুক্ত করে তবে উত্পন্ন শ্রেণিবদ্ধ পদ্ধতি স্বাক্ষর আপডেট করতে ভুলে যায় তখন " ওভাররাইড " দরকারী useful সেক্ষেত্রে বেস এবং উদ্ভূত শ্রেণীর মধ্যে পদ্ধতিগুলি এখন বহুকোষযুক্ত সম্পর্ক নয়। ওভাররাইড ঘোষণা ছাড়াই এই ধরণের বাগটি খুঁজে পাওয়া শক্ত।
override
জাতীয় সমস্যাগুলি আবিষ্কারের দুর্দান্ত উপায় হ'ল, ভাল ইউনিট পরীক্ষার কভারেজটিও সহায়তা করা উচিত।
হ্যাঁ, এটি তাই। এটি নিশ্চিত করার জন্য এটি একটি চেক যে কোনও ওভাররাইড চেষ্টা করে না এবং এটি একটি বোটচেড স্বাক্ষরের মাধ্যমে গণ্ডগোল করে। এখানে একটি উইকি পৃষ্ঠা রয়েছে যা এটি বিশদভাবে ব্যাখ্যা করে এবং এর একটি সংক্ষিপ্ত উদাহরণস্বরূপ উদাহরণ রয়েছে:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
সি ++ 17 স্ট্যান্ডার্ড খসড়া
C ++ 17 N4659 স্ট্যান্ডার্ড খসড়াতে সমস্ত override
হিটগুলি পেরিয়ে যাওয়ার পরে আমি সনাক্তকারীকে কেবলমাত্র উল্লেখ পেতে পারি :override
5 যদি ভার্চুয়াল ফাংশনটি গুণ-নির্দিষ্টকরণকারী ওভাররাইডের সাথে চিহ্নিত করা হয় এবং কোনও বেস শ্রেণীর সদস্য ফাংশনকে ওভাররাইড না করে, প্রোগ্রামটি দুর্গঠিত। [উদাহরণ:
struct B { virtual void f(int); }; struct D : B { virtual void f(long) override; // error: wrong signature overriding B::f virtual void f(int) override; // OK }
- শেষ উদাহরণ]
সুতরাং আমি মনে করি যে সম্ভবত ভুল প্রোগ্রামগুলি ফুটিয়ে তোলা আসলে একমাত্র প্রভাব।