যে কেউ জাভাতে ডায়নামিক এবং স্ট্যাটিক পলিমারফিজমের মধ্যে পার্থক্য ব্যাখ্যা করে এমন একটি সাধারণ উদাহরণ সরবরাহ করতে পারেন ?
যে কেউ জাভাতে ডায়নামিক এবং স্ট্যাটিক পলিমারফিজমের মধ্যে পার্থক্য ব্যাখ্যা করে এমন একটি সাধারণ উদাহরণ সরবরাহ করতে পারেন ?
উত্তর:
পলিমরফিজ্ম
1. স্ট্যাটিক বন্ডিং / কমাইল-টাইম বাইন্ডিং / আর্লি বাইন্ডিং / মেথড ওভারলোডিং। (একই ক্লাসে)
2. ডায়নামিক বাঁধাই / রান-টাইম বাইন্ডিং / দেরী বাঁধাই / পদ্ধতি ওভাররাইডিং (বিভিন্ন শ্রেণিতে)
class Calculation {
void sum(int a,int b){System.out.println(a+b);}
void sum(int a,int b,int c){System.out.println(a+b+c);}
public static void main(String args[]) {
Calculation obj=new Calculation();
obj.sum(10,10,10); // 30
obj.sum(20,20); //40
}
}
class Animal {
public void move(){
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move();//output: Animals can move
b.move();//output:Dogs can walk and run
}
}
Animal reference but Dog object
কী, আমরা কেন ব্যবহার করতে পারি না Dog reference and dog object
?
ডায়নামিক (রান টাইম) পলিমারফিজম হ'ল পলিমারফিজম রান-টাইমে বিদ্যমান ছিল। এখানে জাভা সংকলক বুঝতে পারে না যে সংকলনের সময় কোন পদ্ধতিটি ডাকা হয়। রান-টাইমে কোন পদ্ধতিটি ডাকা হবে তা কেবলমাত্র জেভিএমই স্থির করে। উদাহরণস্বরূপ পদ্ধতিগুলি ব্যবহার করে মেথড ওভারলোডিং এবং মেথড ওভাররাইড করা গতিশীল পলিমারফিজমের উদাহরণ।
উদাহরণ স্বরূপ,
এমন একটি অ্যাপ্লিকেশন বিবেচনা করুন যা বিভিন্ন ধরণের দস্তাবেজগুলিকে সিরিয়ালাইজ করে এবং ডি-সিরিয়ালাইজ করে।
বেস ক্লাস এবং এর থেকে প্রাপ্ত বিভিন্ন ডকুমেন্ট টাইপের ক্লাস হিসাবে আমাদের 'ডকুমেন্ট' থাকতে পারে। যেমন এক্সএমএল ডকুমেন্ট, ওয়ার্ড ডকুমেন্ট ইত্যাদি
ডকুমেন্ট ক্লাসটি 'সিরিয়ালাইজ ()' এবং 'ডি-সিরিয়ালাইজ ()' পদ্ধতিগুলি ভার্চুয়াল হিসাবে সংজ্ঞায়িত করবে এবং প্রতিটি উত্পন্ন শ্রেণি নথির প্রকৃত বিষয়বস্তুর উপর ভিত্তি করে এই পদ্ধতিগুলি নিজস্ব পদ্ধতিতে প্রয়োগ করবে।
যখন বিভিন্ন ধরণের ডকুমেন্টগুলি সিরিয়ালযুক্ত / ডি-সিরিয়ালাইজড করা দরকার হয়, তখন নথির অবজেক্টগুলিকে 'ডকুমেন্ট' শ্রেণি রেফারেন্স (বা পয়েন্টার) দ্বারা উল্লেখ করা হবে এবং যখন 'সিরিয়ালাইজ ()' বা 'ডি-সিরিয়ালাইজ ()' পদ্ধতি বলা হবে এটিতে ভার্চুয়াল পদ্ধতিগুলির উপযুক্ত সংস্করণগুলি বলা হয়।
স্ট্যাটিক (সংকলনের সময়) বহুবর্ষটি সংকলন সময়ে প্রদর্শিত বহুবর্ষবাদ। এখানে জাভা সংকলক জানে কোন পদ্ধতিটি বলা হয়। স্থির পদ্ধতি ব্যবহার করে পদ্ধতি ওভারলোডিং এবং পদ্ধতি ওভাররাইড; ব্যক্তিগত বা চূড়ান্ত পদ্ধতি ব্যবহার করে মেথড ওভাররাইড করা স্ট্যাটিক পলিমারফিজমের উদাহরণ
উদাহরণ স্বরূপ,
কোনও কর্মচারী অবজেক্টের দুটি মুদ্রণ () পদ্ধতি থাকতে পারে একটিতে কোনও যুক্তি না নিয়ে এবং একটিতে কর্মচারীর ডেটা সহ প্রিফিক্স স্ট্রিং প্রদর্শিত হয়।
এই ইন্টারফেসগুলি প্রদত্ত, যখন মুদ্রণ () পদ্ধতিটি কোনও আর্গুমেন্ট ছাড়াই ডাকা হয়, সংকলক, ফাংশন আর্গুমেন্টগুলির দিকে তাকিয়ে জানে কোন ফাংশনটি বলা হবে তা বোঝায় এবং সে অনুযায়ী অবজেক্ট কোড উত্পন্ন করে।
আরও তথ্যের জন্য দয়া করে "পলিমারফিজম কী" (গুগল এটি) পড়ুন।
বাইন্ডিং পদ্ধতি কল এবং পদ্ধতি সংজ্ঞা মধ্যে লিঙ্ক বোঝায়।
এই ছবিটি পরিষ্কারভাবে কী বাধ্যবাধকতা তা দেখায়।
এই ছবিতে, "a1.methodOne ()" কলটি সম্পর্কিত পদ্ধতিOne () সংজ্ঞা এবং "a1.methodTwo ()" কলটি সংশ্লিষ্ট মেথডটু () সংজ্ঞায় আবদ্ধ।
প্রতিটি পদ্ধতির কলের জন্য যথাযথ পদ্ধতির সংজ্ঞা থাকতে হবে। এটি জাভাতে একটি নিয়ম। সংকলক যদি প্রতিটি পদ্ধতি কলের জন্য সঠিক পদ্ধতির সংজ্ঞাটি না দেখায় তবে এটি ত্রুটি ছুঁড়ে দেয়।
এখন, জাভাতে স্ট্যাটিক বাঁধাই এবং গতিশীল বাঁধাইয় আসুন।
জাভাতে স্থির বাইন্ডিং:
স্ট্যাটিক বাঁধাই একটি বাঁধাই যা সংকলনের সময় ঘটে। একে প্রারম্ভিক বাঁধাই বলা হয় কারণ কোনও প্রোগ্রাম আসলে চলার আগে বাইন্ডিং হয়
।
স্ট্যাটিক বাইন্ডিং নীচের ছবি মত প্রদর্শিত হতে পারে।
এই ছবিতে, 'a1' টাইপ শ্রেণীর একটি রেফারেন্স ভেরিয়েবল যা ক্লাস এ এর অবজেক্টকে নির্দেশ করছে। 'a2' টাইপ ক্লাস এ এর রেফারেন্স ভেরিয়েবল তবে ক্লাস বি এর অবজেক্টের দিকে নির্দেশ করছে ting
সংকলনের সময়, বাঁধাইয়ের সময়, সংকলক কোনও নির্দিষ্ট রেফারেন্স ভেরিয়েবলটি কীভাবে নির্দেশ করছে তা অবজেক্টের প্রকারটি পরীক্ষা করে না। এটি কেবলমাত্র রেফারেন্স ভেরিয়েবলের প্রকারটি পরীক্ষা করে যার মাধ্যমে কোনও পদ্ধতি বলা হয় এবং এটি পরীক্ষা করে যে এটির জন্য কোনও পদ্ধতির সংজ্ঞা রয়েছে কি না whether
উদাহরণস্বরূপ, উপরের ছবিতে "a1.method ()" পদ্ধতি কলের জন্য, সংকলক ক্লাস এ-তে পদ্ধতি () এর জন্য পদ্ধতি সংজ্ঞা রয়েছে কিনা তা সংকলক পরীক্ষা করে কারণ 'a1 Class ক্লাস এ টাইপ। একইভাবে, "a2.method ()" পদ্ধতি কলের জন্য, এটি ক্লাস এ-তে পদ্ধতি () এর জন্য পদ্ধতি সংজ্ঞা আছে কিনা তা পরীক্ষা করে দেখায় কারণ 'a2 also এছাড়াও ক্লাস এ টাইপ। 'A1' এবং 'a2' কোন বস্তুর দিকে নির্দেশ করছে তা এটি পরীক্ষা করে না। এই ধরণের বাইন্ডিংকে স্ট্যাটিক বাঁধাই বলা হয়।
জাভাতে গতিশীল বাঁধাই:
ডায়নামিক বাঁধাই একটি বাঁধাই যা রান সময়ের সময় ঘটে happens এটিকে দেরীতে বাইন্ডিংও বলা হয় কারণ যখন প্রোগ্রামটি আসলে চলমান থাকে তখন বাইন্ডিং হয়।
রান টাইমের সময় আসল অবজেক্টগুলি বাইন্ডিংয়ের জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, উপরের ছবিতে "a1.method ()" কল করার জন্য, 'a1' নির্দেশ করছে এমন প্রকৃত অবজেক্টের পদ্ধতি () কল করা হবে। "A2.method ()" কলের জন্য, 'a2' নির্দেশ করছে এমন প্রকৃত অবজেক্টের পদ্ধতি () কল করা হবে। এই ধরণের বাইন্ডিংকে ডায়নামিক বাইন্ডিং বলা হয়।
উপরের উদাহরণটির গতিশীল বাঁধাই নীচের মতো প্রদর্শিত হতে পারে।
জাভা রেফারেন্স স্থির-বাঁধার এবং-গতিশীল-বাইন্ডিং-ইন ava
পলিমারফিজম: পলিমারফিজম হ'ল একটি বস্তুর বিভিন্ন রূপ ধারণ করার ক্ষমতা। ওওপিতে পলিমারফিজমের সর্বাধিক প্রচলিত ব্যবহার তখন ঘটে যখন পিতা-মাতার শ্রেণি রেফারেন্সটি শিশু শ্রেণীর অবজেক্টের জন্য উল্লেখ করা হয়।
গতিশীল বাঁধাই / রানটাইম পলিমারফিজম:
রান টাইম পলিমারফিজমকে মেথড ওভাররাইডিং নামেও পরিচিত। এই মেকানিজমে যার দ্বারা ওভাররাইড ফাংশনটির কলটি রান-টাইমে সমাধান করা হয়।
public class DynamicBindingTest {
public static void main(String args[]) {
Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car
vehicle.start(); //Car's start called because start() is overridden method
}
}
class Vehicle {
public void start() {
System.out.println("Inside start method of Vehicle");
}
}
class Car extends Vehicle {
@Override
public void start() {
System.out.println("Inside start method of Car");
}
}
আউটপুট:
গাড়ীর ভিতরে স্টার্ট পদ্ধতি
স্ট্যাটিক বাঁধাই / সংকলন-সময় বহুবর্ষ:
কোন পদ্ধতিটি ডাকা হবে তা কেবল সংকলন-সময়েই সিদ্ধান্ত নেওয়া হয়।
public class StaticBindingTest {
public static void main(String args[]) {
Collection c = new HashSet();
StaticBindingTest et = new StaticBindingTest();
et.sort(c);
}
//overloaded method takes Collection argument
public Collection sort(Collection c){
System.out.println("Inside Collection sort method");
return c;
}
//another overloaded method which takes HashSet argument which is sub class
public Collection sort(HashSet hs){
System.out.println("Inside HashSet sort method");
return hs;
}
}
আউটপুট: সংগ্রহের ধরণের ধরণের মেথো
মেথড ওভারলোডিং সংকলন সময় / স্ট্যাটিক পলিমॉर्फিজমের একটি উদাহরণ কারণ মেথড কল এবং মেথড ডেফিনেশনের মধ্যে মেথড বাইন্ডিং সংকলন সময়ে ঘটে এবং এটি ক্লাসের রেফারেন্সের উপর নির্ভর করে (সংকলন সময়ে তৈরি রেফারেন্স এবং স্ট্যাকের দিকে যায়)।
মেথড ওভাররাইডিং রান টাইম / ডায়নামিক পলিমারফিজমের একটি উদাহরণ কারণ মেথড কল এবং মেথড ডেফিনিশনের মধ্যে মেথড বাইন্ডিং রান টাইমে ঘটে এবং এটি ক্লাসের অবজেক্টের উপর নির্ভর করে (রানটাইম এ তৈরি হওয়া অবজেক্ট এবং হিপে যায়)।
সহজ অর্থে :
স্ট্যাটিক পলিমারফিজম : একই পদ্ধতির নাম একই শ্রেণিতে বিভিন্ন ধরণের বা পরামিতির সংখ্যার(বিভিন্ন স্বাক্ষর)দিয়ে ওভারলোড হয়। লক্ষ্যযুক্ত পদ্ধতি কলটি সংকলনের সময়ে সমাধান করা হয়।
গতিশীল পলিমারফিজম : একই পদ্ধতিতে বিভিন্ন শ্রেণিতে একই স্বাক্ষর দিয়ে ওভাররাইড করা হয়। কোন পদ্ধতিতে কোন পদটি আহ্বান করা হচ্ছে তা সংকলনের সময় জানা যায়নি তবে রান টাইমে সিদ্ধান্ত নেওয়া হবে।
সাধারণত ওভারলোডিংকে বহুরূপী হিসাবে বিবেচনা করা হবে না।
জাভা টিউটোরিয়াল পৃষ্ঠা থেকে :
একটি শ্রেণীর সাবক্লাসগুলি তাদের নিজস্ব অনন্য আচরণগুলি সংজ্ঞায়িত করতে পারে এবং তবুও পিতামাতার শ্রেণির একই কার্যকারিতা কিছু ভাগ করতে পারে
Generally overloading won't be considered as polymorphism.
আপনি কি এই পয়েন্টটি বিস্তারিত বলতে পারেন?
পদ্ধতি ওভারলোডিং হিসাবে পরিচিত হয় স্ট্যাটিক পলিমরফিজ্ম এবং নামেও পরিচিত কম্পাইল সময় পলিমরফিজ্ম বা বাঁধাই স্ট্যাটিক কারণ ওভারলোড পদ্ধতি কল আর্গুমেন্ট তালিকার ভিত্তিতে কম্পাইলার এবং রেফারেন্স আমরা পদ্ধতি আহ্বান করা হয় যার উপর দ্বারা কম্পাইল সময়ে সমাধান পেতে।
এবং মেথড ওভাররাইডিং ডায়নামিক পলিমারফিজম বা সাদামাটা পলিমারফিজম বা রানটাইম মেথড ডিসপ্যাচ বা ডায়নামিক বাইন্ডিং হিসাবে পরিচিত কারণ ওভাররাইড পদ্ধতিতে কল রানটাইমের সময়ে সমাধান হয়ে যায়।
এটি কেন তা বোঝার জন্য আসুন Mammal
এবং Human
বর্গের একটি উদাহরণ নেওয়া যাক
class Mammal {
public void speak() { System.out.println("ohlllalalalalalaoaoaoa"); }
}
class Human extends Mammal {
@Override
public void speak() { System.out.println("Hello"); }
public void speak(String language) {
if (language.equals("Hindi")) System.out.println("Namaste");
else System.out.println("Hello");
}
}
আমি আউটপুট পাশাপাশি কোডের নীচের লাইনের বাইটকোড অন্তর্ভুক্ত করেছি
Mammal anyMammal = new Mammal();
anyMammal.speak(); // Output - ohlllalalalalalaoaoaoa
// 10: invokevirtual #4 // Method org/programming/mitra/exercises/OverridingInternalExample$Mammal.speak:()V
Mammal humanMammal = new Human();
humanMammal.speak(); // Output - Hello
// 23: invokevirtual #4 // Method org/programming/mitra/exercises/OverridingInternalExample$Mammal.speak:()V
Human human = new Human();
human.speak(); // Output - Hello
// 36: invokevirtual #7 // Method org/programming/mitra/exercises/OverridingInternalExample$Human.speak:()V
human.speak("Hindi"); // Output - Namaste
// 42: invokevirtual #9 // Method org/programming/mitra/exercises/OverridingInternalExample$Human.speak:(Ljava/lang/String;)V
এবং উপরের কোডটি দেখে আমরা দেখতে পারি যে হিউম্যানম্যামাল.স্পিক (), হিউম্যান.স্পেক () এবং হিউম্যান.স্পিক ("হিন্দি") এর বাইটোকডগুলি সম্পূর্ণ আলাদা কারণ কারণ সংকলক যুক্তির তালিকার ভিত্তিতে তাদের মধ্যে পার্থক্য করতে সক্ষম এবং শ্রেণি রেফারেন্স। এবং এ কারণেই মেথড ওভারলোডিং স্ট্যাটিক পলিমারফিজম হিসাবে পরিচিত ।
কিন্তু যে কোনও ম্যাম্মাল.স্পিক () এবং হিউম্যানম্যামাল.স্পিক () এর জন্য বাইটকোড একই কারণ সংকলক অনুসারে উভয় পদ্ধতি স্তন্যপায়ী রেফারেন্সে বলা হয় তবে উভয় পদ্ধতি কলের আউটপুট আলাদা কারণ রানটাইম সময়ে জেভিএম জানে রেফারেন্সটি কোন বস্তুটি ধারণ করে এবং জেভিএম কলগুলি অবজেক্টের পদ্ধতি এবং এ কারণেই মেথড ওভাররাইডিং ডায়নামিক পলিমারফিজম হিসাবে পরিচিত।
সুতরাং উপরের কোড এবং বাইটকোড থেকে এটি স্পষ্ট যে সংকলনের সময় কল করার পদ্ধতিটি রেফারেন্সের ধরণ থেকে বিবেচনা করা হয়। কিন্তু প্রয়োগের সময় পদ্ধতিটি সেই অবজেক্ট থেকে কল করা হবে যা রেফারেন্সটি ধারণ করে।
আপনি যদি এ সম্পর্কে আরও জানতে চান তবে আপনি কীভাবে JVM হ্যান্ডেল পদ্ধতিটি ওভারলোডিং এবং অভ্যন্তরীণভাবে ওভাররাইডিং পরিচালনা করে তা আরও পড়তে পারেন ।
স্ট্যাটিক পলিমারফিজম: সঙ্কলনের সময় কোন পদ্ধতিটি সম্পন্ন করতে হবে তা সমাধান করার সিদ্ধান্ত নির্ধারিত হয়। পদ্ধতি ওভারলোডিং এর উদাহরণ হতে পারে।
ডায়নামিক পলিমারফিজম: রান-টাইমের সময় কোন পদ্ধতিটি কার্যকর করতে হবে তা বেছে নেওয়ার সিদ্ধান্ত নেওয়া হয়েছে। মেথড ওভাররাইডিং এর উদাহরণ হতে পারে।
পলিমারফিজম বলতে একই ট্রিগারটির জন্য কোনও বস্তুর আলাদা আচরণ করার ক্ষমতা বোঝায়।
স্ট্যাটিক পলিমারফিজম (কম্পাইল-টাইম পলিমॉर्फিজম)
গতিশীল পলিমারফিজম (রানটাইম পলিমারফিজম)
কম্পাইল টাইম পলিমারফিজম (স্ট্যাটিক বাইন্ডিং / আর্লি বাইন্ডিং): স্ট্যাটিক পলিমারফিজমে, আমরা যদি আমাদের কোডটিতে একটি পদ্ধতি কল করি তবে সেই পদ্ধতির কোন সংজ্ঞাটি আসলে সংকলনের সময় সমাধান করা হয়।
(বা)
সংকলনের সময়, জাভা পদ্ধতিটি স্বাক্ষরগুলি যাচাই করে কোন পদ্ধতিটি চালাবেন তা জানেন। সুতরাং, এটিকে সংকলন-সময় পলিমারফিজম বা স্ট্যাটিক বাইন্ডিং বলা হয়।
ডায়নামিক পলিমারফিজম (দেরীতে বাইন্ডিং / রানটাইম পলিমারফিজম): রান সময় সময়ে জাভা রানটাইম পর্যন্ত অপেক্ষা করে যে কোন বস্তুকে আসলে রেফারেন্স দ্বারা নির্দেশ করা হচ্ছে তা নির্ধারণ করার জন্য। রানটাইমের সময় পদ্ধতির রেজোলিউশন নেওয়া হয়েছিল, যার কারণে আমরা রান টাইম পলিমারফিজম বলে থাকি।
নীচের কোডটি বিবেচনা করুন:
public class X
{
public void methodA() // Base class method
{
System.out.println ("hello, I'm methodA of class X");
}
}
public class Y extends X
{
public void methodA() // Derived Class method
{
System.out.println ("hello, I'm methodA of class Y");
}
}
public class Z
{
public static void main (String args []) {
//this takes input from the user during runtime
System.out.println("Enter x or y");
Scanner scanner = new Scanner(System.in);
String value= scanner.nextLine();
X obj1 = null;
if(value.equals("x"))
obj1 = new X(); // Reference and object X
else if(value.equals("y"))
obj2 = new Y(); // X reference but Y object
else
System.out.println("Invalid param value");
obj1.methodA();
}
}
এখন কোডটি দেখে আপনি কখনই বলতে পারবেন না যে মেথডএএ () এর কোন বাস্তবায়ন কার্যকর হবে, কারণ এটি রানটাইমের সময় ব্যবহারকারী কী মান দেয় তার উপর নির্ভর করে। সুতরাং, কোন পদ্ধতিটি ডাকা হবে তা কেবল রানটাইমের সময় স্থির হয়। অতএব, রানটাইম বহুমুখীতা।
পদ্ধতি ওভারলোডিং একটি সংকলন সময় বহুবর্ষ, এটি ধারণাটি বোঝার জন্য একটি উদাহরণ নেওয়া যাক।
class Person //person.java file
{
public static void main ( String[] args )
{
Eat e = new Eat();
e.eat(noodle); //line 6
}
void eat (Noodles n) //Noodles is a object line 8
{
}
void eat ( Pizza p) //Pizza is a object
{
}
}
এই উদাহরণে, ব্যক্তির একটি খাওয়ার পদ্ধতি রয়েছে যা প্রতিনিধিত্ব করে যে সে হয় পিজ্জা বা নুডলস খেতে পারে। যে পদ্ধতিটি খাওয়া হয় তা অতিরিক্ত লোড হয় we যখন আমরা এই ব্যক্তিকে সংকলন করি ava জাভা কম্পাইলার "ই.ইয়েট (নুডলস) [যা line লাইনে রয়েছে] পদ্ধতি কলটি 8 নং লাইনে নির্দিষ্ট পদ্ধতির সংজ্ঞা দিয়ে সমাধান করেছে যা নুডলসকে প্যারামিটার হিসাবে গ্রহণ করে এবং সম্পূর্ণ প্রক্রিয়াটি কম্পাইলার দ্বারা সম্পন্ন হয় তাই এটি সংকলন সময় পলিমারফিজম হয় method পদ্ধতি সংজ্ঞা সহ পদ্ধতি কলটি প্রতিস্থাপনের প্রক্রিয়াটিকে বাধ্যতামূলক বলা হয়, এক্ষেত্রে এটি কম্পাইলার দ্বারা সম্পন্ন করা হয় তাই একে প্রাথমিক বাইন্ডিং বলা হয়।
নরেশের উত্তর অনুসরণ করে, ভার্চুয়াল মেশিনের উপস্থিতি এবং কোডটি স্থানীয়ভাবে চলার পরিবর্তে রান সময়ে কোড ব্যাখ্যা করার দক্ষতার কারণে জাভাতে গতিশীল পলিমারফিজম কেবল 'গতিশীল'।
সি ++ তে অবশ্যই এটি সঙ্কলনের সময় সমাধান করা উচিত যদি এটি জিসিসি ব্যবহার করে কোনও দেশীয় বাইনারি সংকলন করা হয়, অবশ্যই; তবে ভার্চুয়াল টেবিলের রানটাইম জাম্প এবং থাঙ্কটিকে এখনও 'লুক' বা 'ডায়নামিক' হিসাবে উল্লেখ করা হয়। সি যদি বি এর উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং আপনি ঘোষণা করেনB* b = new C(); b->method1();
, বি সি এর ভিতরে একটি বি অবজেক্টের দিকে নির্দেশ করার জন্য সংকলক দ্বারা সমাধান করা হবে (সাধারণ শ্রেণীর জন্য বর্গের পরিস্থিতি উত্তরাধিকার সূত্রে প্রাপ্ত, সি এবং সি এর মধ্যে বি অবজেক্ট একই মেমরি ঠিকানায় শুরু হবে তাই কিছুই হবে না এটি করা প্রয়োজন; এটি উভয়ই ব্যবহার করে এমন ভিটিপিআরটি নির্দেশ করবে)। সি যদি বি এবং এ উত্তরাধিকার সূত্রে প্রাপ্ত হয়, মেথড 1 এর জন্য সি এন্ট্রির অভ্যন্তরে অবস্থিত একটি অবজেক্টের ভার্চুয়াল ফাংশন টেবিলটিতে একটি বিভাজন থাকবে যা পয়েন্টারটিকে এনক্যাপসুলেটিং সি অবজেক্টের শুরুতে অফসেট করবে এবং তারপরে এটি আসল এ :: পদ্ধতি 1 () তে প্রেরণ করবে পাঠ্য বিভাগে যা সি ওভাররাইড করেছে। জন্যC* c = new C(); c->method1()
, সি ইতিমধ্যে বাহ্যিক সি বস্তুটির দিকে নির্দেশ করবে এবং পাঠ্য বিভাগে পয়েন্টারটি সি :: পদ্ধতি 1 () এ প্রেরণ করা হবে। এখানে দেখুন: http://www.programmersought.com/article/2572545946/
জাভাতে, B b = new C(); b.method1();
ভার্চুয়াল মেশিনটি গতির সাথে খের সাথে যুক্ত বস্তুর প্রকারটি পরীক্ষা করতে সক্ষম হয় এবং সঠিক পয়েন্টারটি পাস করে সঠিক পদ্ধতিটি কল করতে পারে। ভার্চুয়াল মেশিনের অতিরিক্ত পদক্ষেপটি ভার্চুয়াল ফাংশন সারণীর প্রয়োজনীয়তা বা সংকলনের সময় প্রকারটি সমাধান করার ধরণটি সরিয়ে দেয়, এমনকি যখন এটি সংকলন সময়ে জানা যায়। এটি করার একটি ভিন্ন উপায় যা কোনও ভার্চুয়াল মেশিনের সাথে জড়িত থাকে এবং কোডটি কেবল বাইকোডে সংকলিত হয়ে গেলে তা বোঝায়।