খাঁটি ভার্চুয়াল ফাংশনটি কেন 0 দিয়ে শুরু করা হয়?


147

আমরা সর্বদা খাঁটি ভার্চুয়াল ফাংশন হিসাবে ঘোষণা করি:

virtual void fun () = 0 ;

অর্থাৎ এটি সর্বদা 0 তে নির্ধারিত হয়।

আমি যা বুঝি তা হ'ল এই ফাংশনটির জন্য এনটিএলএল এবং অন্য যে কোনও মান এখানে একটি সংকলন সময় ত্রুটির ফলস্বরূপ vtable এন্ট্রি আরম্ভ করা। এই বোঝাপড়াটি সঠিক নাকি না?


12
মনে রাখবেন যে ভেটেবল কোনও ভাষার প্রয়োজনীয়তা নয়, তবে ভার্চুয়াল পদ্ধতিগুলির জন্য কেবল একটি বাস্তবায়ন বিকল্প। একটি সংকলক একটি ভিন্ন বাস্তবায়নের সাথে একই বিমূর্ততা তৈরি করতে পারে (এটি ভিটিবেল ছাড়াই এবং কোনও উপাদান ছাড়াই 0 নেই)
ডেভিড রদ্রিগেজ - শুক্রবার

@ হাইপ আপনার সম্পূরক প্রশ্ন পুনরায় করুন - এটাই আমার উত্তর (এবং আরও বেশ কয়েকটি) বলেছে says

শুধু কৌতুহলী, আমি দিলে কি হয় virtual void func() = 100;
কৃতিকাগোপালকৃষ্ণন

উত্তর:


161

কারণটি =0ব্যবহার করা হচ্ছে এটি হ'ল যে বর্জন স্ট্রস্ট্রপ ভেবেছিলেন না যে তিনি আর কোনও কীওয়ার্ড পেয়ে যাবেন, যেমন বৈশিষ্ট্যটি কার্যকর হওয়ার সময় সি ++ সম্প্রদায়ের অতীত "খাঁটি"। এটি তাঁর গ্রন্থ, সি ++ এর ডিজাইন এবং বিবর্তন বিভাগে বিভাগে ১৩.২.৩ বর্ণিত হয়েছে :

কৌতূহলী = 0 বাক্য গঠনটি বেছে নেওয়া হয়েছিল ... কারণ আমি তখন নতুন কীওয়ার্ড গ্রহণের কোনও সুযোগ পাইনি।

তিনি স্পষ্টতই বলেছিলেন যে এটিকে NUL এ vtable এন্ট্রি সেট করার দরকার নেই এবং এটি করা খাঁটি ভার্চুয়াল ফাংশন বাস্তবায়নের সর্বোত্তম উপায় নয়।


4
হ্যাঁ, এটি কেবল সিনট্যাক্স। আমি প্রচুর প্রকল্প দেখেছি যা # শুদ্ধ = 0 নির্ধারণ করে এবং তারা ভার্চুয়াল শূন্যতা ফু () পিওর বলবে;
আই_আম_জোরফ

79
দয়া করে God

27
এটি # ডেফাইন বিগিন {# ডিফাইন শেষ} ;-) এর চেয়ে অনেক কম খারাপ এবং আমি কখনও কখনও দেখেছি।
টুন ক্রিজেতে

5
এই ধরণের নিফটি জিনিসটি আমাকে ভাবায় যে সি ++ খুব পোলিশ নয়। এটি এত বেশি ব্যবহৃত হয়েছে বিবেচনা করে অদ্ভুত। আমি আশা করি দিনগুলি উত্তীর্ণ হওয়ার সাথে সাথে ভাষা আরও ভাল হবে।
জোকুন

19
সুতরাং, অন্য কথায়, "ডিজাইনের ত্রুটি" কাটানোর জন্য বার্জনকে "একটি সময়সীমার মুখোমুখি হয়েছিল" এবং "একটি হ্যাক ব্যবহার করা হয়েছিল";) (কেবল মুখোমুখি হওয়া)
কার্ল

78

সি ++ এর ডিজাইন সম্পর্কে সর্বাধিক "কেন" প্রশ্নগুলির মতো, প্রথম স্থানটি হ'ল ডিজাইন অ্যান্ড ইভোলিউশন অফ সি ++ , বজরেন স্ট্রস্ট্রপ 1 :

কৌতূহলী =0বাক্য গঠনটি একটি নতুন কীওয়ার্ড প্রবর্তনের সুস্পষ্ট বিকল্পের উপরে pureবা abstractসেই সময় আমি কোনও নতুন কীওয়ার্ড গ্রহণ করার কোনও সুযোগ দেখেনি বলে বেছে নেওয়া হয়েছিল । আমি যদি পরামর্শ দিয়েছিলাম pure, রিলিজ ২.০ অ্যাবস্ট্রাক্ট ক্লাস ছাড়াই পাঠানো হত। একটি ভাল সিনট্যাক্স এবং বিমূর্ত শ্রেণীর মধ্যে একটি পছন্দ দেওয়া, আমি বিমূর্ত ক্লাস বেছে নিয়েছি। বিলম্বকে ঝুঁকিপূর্ণ করা এবং নির্দিষ্ট লড়াইয়ের উপর চাপ দেওয়ার পরিবর্তে pureআমি "সেখানে নেই" উপস্থাপনের জন্য 0 ব্যবহারের traditionতিহ্য সি এবং সি ++ কনভেনশনটি ব্যবহার করেছি। =0আমার দৃষ্টিতে যে একটা ফাংশন শরীর (সরল, কিন্তু সাধারণত পর্যাপ্ত) ভার্চুয়াল ফাংশন সেট দৃশ্য ফাংশন পয়েন্টার একটি ভেক্টর হিসাবে প্রয়োগ করা হচ্ছে একটি ফাংশন এছাড়াও সূচনাকারী সঙ্গে সিনট্যাক্স আছে। [...]

1 §13.2.3 সিনট্যাক্স


29

সি ++ স্ট্যান্ডার্ডের 9.2 ধারাটি ক্লাস সদস্যদের জন্য সিনট্যাক্স দেয়। এটি এই উত্পাদন অন্তর্ভুক্ত:

pure-specifier:
    = 0

মান সম্পর্কে বিশেষ কিছু নেই। "এই ফাংশনটি খাঁটি ভার্চুয়াল" for এটি সূচনা বা নাল পয়েন্টার বা সংখ্যার মান শূন্যের সাথে কিছুই করার নেই, যদিও এই জিনিসের সাথে মিলটির মনোভাবগত মান থাকতে পারে।


5
সি ++ স্ট্যান্ডার্ড উল্লেখ করার জন্য +1। এটি এক ধরণের অবাক করে দেওয়া যে সম্ভাব্য উত্তরগুলির মধ্যে একটি এবং এ পর্যন্ত মাত্র 1 টি ভোট পেয়েছে। সি ++ প্রশ্নগুলি সমাধান করার জন্য স্ট্যান্ডার্ডটি পড়া প্রথম পদক্ষেপ হওয়া উচিত।
এম্লসকোট

7
@ম্লোসকোট: সম্ভবত ওপি-র প্রশ্নের উত্তর না দেয়ায়, পরিস্থিতি পুনরুদ্ধার করে?
মাত্র 21

6
@ কাউকে সামঞ্জস্য করুন - এতে স্ট্যান্ডার্ড উদ্ধৃতি অন্তর্ভুক্ত রয়েছে যা জানায় খাঁটি ভার্চুয়াল ফাংশন ঘোষণার বাক্য গঠনটি কী এবং সিনট্যাক্সটি বিশুদ্ধ-নির্দিষ্টকরণকারী ব্যবহার করে = 0আপনি আর কী জানতে চান? ফাংশন বডি কেন with with দিয়ে মোড়ানো থাকে তা জিজ্ঞাসা করার মতোই উত্তর হবে, কারণ এটিই সি ++ সিনট্যাক্সকে সংজ্ঞায়িত করে।
এম্লসকোট

19

এর পিছনে কোনও অর্থ আছে কিনা তা আমি নিশ্চিত নই। এটি কেবল ভাষার সিনট্যাক্স।


16

নতুন সংরক্ষিত শব্দগুলি পুরানো প্রোগ্রামগুলিকে ভেঙে দেয় যা সনাক্তকারীদের জন্য এই শব্দগুলি ব্যবহার করে, সি ++ সবসময় নতুন কীওয়ার্ড প্রবর্তন থেকে বিরত থাকে। এটি প্রায়শই ভাষার অন্যতম শক্তি হিসাবে দেখা যায় যে এটি যতটা সম্ভব পুরানো কোডকে সম্মান করে।

= 0যেহেতু এটি একটি vtable এন্ট্রি সেটিং বর্ণনার অনুরূপ বাক্য গঠন প্রকৃতপক্ষে মনোনীত হয়ে থাকতে পারে 0, কিন্তু এই বিশুদ্ধরূপে আলংকারিক। (বেশিরভাগ সংকলকগণ স্টাবের কাছে এই জাতীয় vtable এন্ট্রি বরাদ্দ করেন যা প্রোগ্রামটি বাতিল করার আগে একটি ত্রুটি অনুভূত করে)) সিনট্যাক্সটি মূলত বেছে নেওয়া হয়েছিল কারণ এটি আগে কোনও কিছুর জন্য ব্যবহৃত হয়নি এবং এটি একটি নতুন কীওয়ার্ড প্রবর্তন করে সংরক্ষণ করেছিল।


3
নতুন কীওয়ার্ড প্রবর্তনের অসুবিধা ব্যাখ্যা করার জন্য +1। যুক্তিটি বুঝতে এটি সহায়ক, তবে সি ++ সিনট্যাক্সটি আমার কাছে অযৌক্তিকভাবে সংশ্লেষিত বলে মনে হচ্ছে এবং আমি আশা করি তারা এটিকে আরও মানব-পঠনযোগ্য করে তুলত - pureআমার বইটিতে একটি কীওয়ার্ড দুর্দান্ত ছিল। যাইহোক, যুক্তি বোঝা ভাল।
কীথ পিনসন

@ কিথপিনসন আপনি যদি খাঁটি কীওয়ার্ড চান তবে আপনি তা করতে পারেন #define pure = 0
jd8

@ জেডি 8: উঃ খালি ... উঘ।
এসবিআই

পার্শ্ব নোট হিসাবে, বার্জনে সহ একটি ক্লাসে তিনি বলেছিলেন যে তিনি "খাঁটি" মূলশব্দটি সি ++ তে আনতে চেয়েছিলেন ... তবে সি ++ সংকলকটি প্রেরণ হওয়ার আগেই তিনি চক্রের খুব দেরিতে এটি পেতে চেষ্টা করেছিলেন (আইআইআরসি) দুই সপ্তাহেরও কম) স্পষ্টতই, এটি এটি তৈরি করে নি
ThePhD

@ দ্য পিএইচডি: আইএসআরটি তিনি ডি ও ই-তে কোথাও এটিও বলেছেন। (যদিও আমি এটি দেখতে খুব অলস, যদিও।)
এসবিআই

11

সাধারণ ভার্চুয়াল ফাংশন ঘোষণার থেকে খাঁটি ভার্চুয়াল ফাংশনকে আলাদা করার জন্য সি ++ এর অবশ্যই একটি উপায় থাকতে হবে। তারা = 0সিনট্যাক্স ব্যবহার করতে বেছে নিয়েছে । খাঁটি কীওয়ার্ড যুক্ত করে তারা সহজেই এটি করতে পারত। তবে সি ++ নতুন কীওয়ার্ড যুক্ত করতে বেশ ঘৃণিত এবং বৈশিষ্ট্যগুলি প্রবর্তন করার জন্য অন্যান্য প্রক্রিয়া ব্যবহার করতে পছন্দ করে।


2
-0: যখন আপনার নিজের বক্তব্য রাখার মতো যথেষ্ট কিছুই নেই, একটি বিস্তৃত উদ্ধৃতি ব্যবহার করুন (জেরি কফিনের উত্তর +1 এর জন্য দেখুন;)
কেবলমাত্র

7

এক্ষেত্রে কিছুই "দীক্ষিত" বা "নির্ধারিত" শূন্য নয়। = 0এর মধ্যে রয়েছে শুধু একটি সিনট্যাক্স কনস্ট্রাক্ট মধ্যে =এবং 0যা একেবারে পারেন আরম্ভের বা নিয়োগ কোনও সম্পর্ক নেই টোকেন।

"ভেটেবল" এর কোনও আসল মানের সাথে এটির কোনও সম্পর্ক নেই। সি ++ ভাষার "vtable" বা এর মতো কোনও ধারণা নেই। বিভিন্ন "vtables" সুনির্দিষ্ট বাস্তবায়নগুলির বিবরণ ছাড়া আর কিছুই নয়।


3

আমার মনে আছে যে মজার সিনট্যাক্সের সমর্থনযোগ্যতাটি ছিল একই জিনিসটি করতে পারে এমন অন্য কীওয়ার্ডটি প্রবর্তন করার চেয়ে সহজ (মান-গ্রহণের শর্তে) was

আমি বিশ্বাস করি যে এটি ডিজাইন অ্যান্ড ইভোলিউশন অফ সি ++ বাজরেন স্ট্রস্ট্রপ দ্বারা উল্লেখ করা হয়েছিল।


2

আমি ধরে নেব যে এটি কেবল সি ++ ব্যাকরণের একটি অংশ। আমি মনে করি না যে সংকলকরা নির্দিষ্ট নির্দিষ্ট বাইনারি ফর্ম্যাটের জন্য বাস্তবে এটি কীভাবে প্রয়োগ করে তাতে কোনও বিধিনিষেধ রয়েছে। আপনার ধারনা সম্ভবত প্রথম দিনের সি ++ সংকলকগুলির জন্য সঠিক ছিল।


2

= 0একটি ঘোষণা বিশুদ্ধ ভার্চুয়াল ফাংশন

যা বোঝা যাচ্ছে তা হ'ল এই ফাংশনটির জন্য এনটিএলএল এবং অন্য যে কোনও মান এখানে সংকলনের সময় ত্রুটির ফলস্বরূপ ভেটেবল এন্ট্রি শুরু করতে হবে

আমি সত্য মনে করি না। এটি কেবল বিশেষ সিনট্যাক্স। Vtable বাস্তবায়ন সংজ্ঞায়িত হয়। কেউ বলে না যে খাঁটি সদস্যের জন্য একটি ভেটেবল এন্ট্রি অবশ্যই নির্মাণের পরে শূন্য করা উচিত (যদিও বেশিরভাগ সংকলক vtables একইভাবে পরিচালনা করেন)।


4
এটা আসলে সত্য নয়। খাঁটি ভার্চুয়াল ফাংশনটির জন্য একটি সংজ্ঞা প্রদানের ক্ষেত্রে কোনও সমস্যা নেই । একমাত্র কাজটি = 0সম্পূর্ণ শ্রেণিকে বিমূর্ত করে তোলে এবং খাঁটি ফাংশনে ভার্চুয়াল কলগুলি নিষিদ্ধ করে। অ-ভার্চুয়াল কলগুলি এখনও পুরোপুরি ঠিক আছে, যা সংজ্ঞাটি (যদি আপনি সরবরাহ করেন) ব্যবহার করা হয়।
এএনটি

শুধু গডবোল্ট আউটপুট দেখুন। অস্পষ্টতা বা অনুমানের কোনও জায়গা নেই। আমি পরে একবার দেখে নেব
লুইস কেলসি

দেখে মনে হচ্ছে এটি __cxa_pure_virtual অ্যারোবেনকো.gitbooks.io/bare_metal_cpp/content/compiler_output/… এর পরিবর্তে বেস :: এফ () এর পরিবর্তে এন্ট্রিটি প্রতিস্থাপন করে
লুইস কেলসি

1

ওয়েল, আপনি একটি বাস্তব ফাংশন নির্দেশ করতে ভিটিবেল এন্ট্রিও শুরু করতে পারেন "

 virtual void fun()
 {
     //dostuff()
 }

স্বজ্ঞাত বলে মনে হচ্ছে যে ভিটিবেল এন্ট্রি হয় কোথাও (0) বা কোনও ফাংশনে নির্দেশ করতে সংজ্ঞায়িত করা যেতে পারে। এর জন্য আপনাকে নিজের মান নির্দিষ্ট করে দিলে সম্ভবত এটি কোনও ফাংশনের পরিবর্তে আবর্জনার দিকে নির্দেশ করবে। তবে সে কারণেই "= 0" অনুমোদিত এবং "= 1" অনুমোদিত নয়। আমার সন্দেহ হয় নীল বাটারওয়ার্থ কেন "= 0" ব্যবহার করা হয় সে সম্পর্কে সঠিক


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