'ওভাররাইড' কীওয়ার্ডটি কি ওভাররাইড ভার্চুয়াল পদ্ধতিতে কেবল একটি পরীক্ষা?


226

আমি যতদূর বুঝতে পেরেছি, overrideসি ++ 11 এ কীওয়ার্ডের প্রবর্তনটি ফাংশনটি বাস্তবায়িত হচ্ছে তা বেস ক্লাসে overrideকোনও virtualফাংশনটির অন্তর্ভুক্ত কিনা তা নিশ্চিত করার জন্য এটি পরীক্ষা করা ছাড়া আর কিছুই নয় ।

এইটাই কি সেইটা?


50
হ্যাঁ.⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣
আর মার্টিনহো ফার্নান্দেস

13
এটি যদিও ডাবল চেক নয়। এটা একমাত্র চেক।
নিকস সি।

13
আরে, ওভাররাইড কোনও কীওয়ার্ড নয়, এটি ব্যাকরণ চিনির মতো। int ওভাররাইড = 42; // ঠিক আছে
কেএলও 2

2
এটি অতিরিক্ত হিসাবে ঘোষিত ফাংশনটি ওভাররাইড করা হয়েছে তা ব্যাখ্যা করার পাঠযোগ্যতার উন্নতি করে;)
মটস_জি

5
সুতরাং, আহ ... সি ++ 11 কখন পর্যাপ্ত মানের হবে যে তারা আমার স্থানীয় 4 বছরের মধ্যে এই জাতীয় জিনিস শেখানো শুরু করবে? তারা কখন জানতে পারবে ?!
সিঞ্চ

উত্তর:


263

এটা আসলে ধারণা। মুল বক্তব্যটি হ'ল আপনি কী বোঝাতে চাইছেন তা সম্পর্কে আপনি স্পষ্ট, যাতে অন্যথায় নীরব ত্রুটি ধরা পড়ে:

struct Base
{
    virtual int foo() const;
};

struct Derived : Base
{
    virtual int foo()   // whoops!
    {
       // ...
    }
};

উপরের কোডটি সংকলন করে তবে আপনি যা বোঝাতে চেয়েছিলেন তা নয় (অনুপস্থিত নোট করুন const)। আপনি যদি এর পরিবর্তে বলেছিলেন virtual int foo() override, তবে আপনি একটি সংকলক ত্রুটি পাবেন যে আপনার ফাংশন আসলে কোনও কিছুই ওভাররাইড করছে না।


74
+1: যদিও, দুর্ভাগ্যক্রমে, লোকেদের নতুন overrideবৈশিষ্ট্যটি "স্থির করে" দেওয়ার পরামর্শ দিলে এটি একটি লাল রঙের হেরিংয়ের কিছুটা ; আপনাকে এটির const
কথাটি

আমি কেবল উপলব্ধি করেছি explicitক্লাস সংজ্ঞাগুলি এটি সি ++ 11 এ তৈরি করে নি। হাহ।
aschepler

1
@ এসচেপলার এবং explicitক্লাস সংজ্ঞাটি কী করবে ? মোটেই শুনিনি।
খ্রিস্টান রাউ

18
@ লাইটনেসেসেসিন অরবিট: হ্যাঁ, এটি বোকা প্রমাণ নয়; তবে, একটি সাধারণ নিয়ম মনে রাখা (পাগলভাবে লেখার জন্য overrideযখন কেউ এটি করার ইচ্ছা করে) তবে কর্নারের কেসগুলি মনে রাখার চেয়ে বেশি সম্ভাবনা থাকে যেমন বিভিন্ন প্রোটোটাইপের ফাংশন অনুলিপি করার ক্ষেত্রে কোনও সাধারণতা নেই, কেবল অনুপস্থিতি constবা charপরিবর্তে লেখার মতো অনিয়ম intইত্যাদি
লেজেন্ডস 2 কে

1
@ লাইট, overrideসুনির্দিষ্ট ব্যবহারকারীর সর্বোত্তম ব্যবহারের ক্ষেত্রে এই উত্তরে উল্লেখ করা হয়েছে , যা তাত্ক্ষণিকের চেয়ে বেশি ভবিষ্যত। উত্তর দাড়ায় যে, রাখা overrideসঙ্গে virtualপদ্ধতি। ভবিষ্যতে যখন কেউ ভুল করে স্বাক্ষর পরিবর্তন করে, তার উপযোগিতাটি কিক্স করে
iammilind

35

উইকিপিডিয়া উদ্ধৃতি:

ওভাররাইড বিশেষ শনাক্তকারীটির অর্থ হ'ল সংকলকটি এই সঠিক স্বাক্ষর সহ ভার্চুয়াল ফাংশন আছে কিনা তা দেখতে বেস ক্লাসটি (এস) পরীক্ষা করবে। এবং যদি না থাকে তবে সংকলকটি ত্রুটিযুক্ত হবে।

http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final

সম্পাদনা করুন (উত্তরটি কিছুটা উন্নত করার চেষ্টা করছেন):

কোনও পদ্ধতিকে "ওভাররাইড" হিসাবে ঘোষণার অর্থ এই পদ্ধতিটি বেস ক্লাসে একটি (ভার্চুয়াল) পদ্ধতি পুনর্লিখনের উদ্দেশ্যে তৈরি । ওভাররাইডিং পদ্ধতিতে পুনরায় লেখার জন্য যে পদ্ধতিটি তৈরি করা হয়েছে তার মতো একই স্বাক্ষর থাকতে হবে (কমপক্ষে ইনপুট পরামিতির জন্য)।

কেন এটি প্রয়োজনীয়? ঠিক আছে, নিম্নলিখিত দুটি সাধারণ ত্রুটিগুলি প্রতিরোধ করা হয়েছে:

  1. একটি নতুন পদ্ধতিতে একটি টাইপ করে ভুল টাইপ করে। সংকলক, অবগত নয় যে এটি পূর্বের পদ্ধতিটি লেখার ইচ্ছা করছে, কেবল এটি ক্লাসে একটি নতুন পদ্ধতি হিসাবে যুক্ত করেছে। সমস্যাটি হ'ল পুরাতন পদ্ধতিটি এখনও রয়েছে, নতুনটি কেবল একটি ওভারলোড হিসাবে যুক্ত করা হয়েছে। এক্ষেত্রে, পুরানো পদ্ধতির দিকে সমস্ত কলগুলি আচরণের কোনও পরিবর্তন ছাড়াই পূর্বের ঠিক ঠিক মতো কাজ করবে (যা পুনরায় লেখার খুব উদ্দেশ্য ছিল)।

  2. একজন সুপারক্লাসে পদ্ধতিটিকে "ভার্চুয়াল" হিসাবে ঘোষণা করতে ভুলে যায় তবে এখনও একটি সাবক্লাসে এটি পুনরায় লেখার চেষ্টা করে। এটি আপাতদৃষ্টিতে স্বীকৃত হয়ে উঠবে, আচরণটি যেমন ঠিক তেমন উদ্দেশ্য অনুসারে হবে না: পদ্ধতিটি ভার্চুয়াল নয়, সুতরাং সুপারক্লাসের দিকে পয়েন্টারগুলির মাধ্যমে অ্যাক্সেস নতুন (সাবক্লাস) পদ্ধতির পরিবর্তে পুরাতন (সুপারক্লাস ') পদ্ধতিটিকে কল করে।

"ওভাররাইড" যুক্ত করা স্পষ্টতই এটিকে ছত্রভঙ্গ করে: এর মাধ্যমে, কেউ সংকলককে বলছেন যে তিনটি জিনিস প্রত্যাশা করছে:

  1. সুপারক্লাসে একই নামের একটি পদ্ধতি রয়েছে
  2. সুপারক্লাসের এই পদ্ধতিটিকে "ভার্চুয়াল" হিসাবে ঘোষণা করা হয়েছে (এর অর্থ, পুনরায় লেখার উদ্দেশ্যে)
  3. সুপারক্লাসের পদ্ধতিটিতে সাবক্লাসের (পুনর্লিখনের পদ্ধতি) পদ্ধতির মতো একই (ইনপুট *) স্বাক্ষর রয়েছে

এর মধ্যে যদি কোনওটি মিথ্যা হয়, তবে একটি ত্রুটি সংকেত দেওয়া হয়।

* দ্রষ্টব্য: আউটপুট প্যারামিটার কখনও কখনও পৃথক, তবে সম্পর্কিত ধরণের হয়। আগ্রহী হলে কোভেরিয়েন্ট এবং বৈষম্যমূলক রূপান্তরগুলি সম্পর্কে পড়ুন।


31

যখন কেউ বেস ক্লাস ভার্চুয়াল পদ্ধতির স্বাক্ষর যেমন alচ্ছিক প্যারামিটার যুক্ত করে তবে উত্পন্ন শ্রেণিবদ্ধ পদ্ধতি স্বাক্ষর আপডেট করতে ভুলে যায় তখন " ওভাররাইড " দরকারী useful সেক্ষেত্রে বেস এবং উদ্ভূত শ্রেণীর মধ্যে পদ্ধতিগুলি এখন বহুকোষযুক্ত সম্পর্ক নয়। ওভাররাইড ঘোষণা ছাড়াই এই ধরণের বাগটি খুঁজে পাওয়া শক্ত।


1
+1 টি। যদিও এই overrideজাতীয় সমস্যাগুলি আবিষ্কারের দুর্দান্ত উপায় হ'ল, ভাল ইউনিট পরীক্ষার কভারেজটিও সহায়তা করা উচিত।
বিভ্রান্ত

1
ঠিক সেই কারণেই আমি সেই নতুন স্পেসিফায়ার সম্পর্কে খুব আগ্রহী। একমাত্র সমস্যা হ'ল বেস শ্রেণিতে পরিবর্তনের ফলে ঘটে যাওয়া ত্রুটিগুলি রোধ করার জন্য এই বৈশিষ্ট্যটি ইতিমধ্যে প্রয়োগ করতে হয়েছিল। ;-)
ওল্ফ

5

হ্যাঁ, এটি তাই। এটি নিশ্চিত করার জন্য এটি একটি চেক যে কোনও ওভাররাইড চেষ্টা করে না এবং এটি একটি বোটচেড স্বাক্ষরের মাধ্যমে গণ্ডগোল করে। এখানে একটি উইকি পৃষ্ঠা রয়েছে যা এটি বিশদভাবে ব্যাখ্যা করে এবং এর একটি সংক্ষিপ্ত উদাহরণস্বরূপ উদাহরণ রয়েছে:

http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final


2

সি ++ 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
}

- শেষ উদাহরণ]

সুতরাং আমি মনে করি যে সম্ভবত ভুল প্রোগ্রামগুলি ফুটিয়ে তোলা আসলে একমাত্র প্রভাব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.