এটি সম্ভব নয়, তবে এটি কেবল একটি বাদ দেওয়া কারণ। এটি এমন কিছু নয় যা অনেক লোক দাবি করে বলে "অর্থবোধ করে না"। পরিষ্কার করে বলতে গেলে, আমি এই জাতীয় কিছু নিয়ে কথা বলছি:
struct Base {
static virtual void sayMyName() {
cout << "Base\n";
}
};
struct Derived : public Base {
static void sayMyName() override {
cout << "Derived\n";
}
};
void foo(Base *b) {
b->sayMyName();
Derived::sayMyName(); // Also would work.
}
এটি 100% এমন কিছু যা বাস্তবায়িত হতে পারে (এটি ঠিক হয়নি), এবং আমি এমন কিছু যুক্তিযুক্ত যা দরকারী।
সাধারণ ভার্চুয়াল ফাংশন কীভাবে কাজ করে তা বিবেচনা করুন। static
গুলি সরান এবং কিছু অন্যান্য জিনিস যোগ করুন এবং আমাদের আছে:
struct Base {
virtual void sayMyName() {
cout << "Base\n";
}
virtual void foo() {
}
int somedata;
};
struct Derived : public Base {
void sayMyName() override {
cout << "Derived\n";
}
};
void foo(Base *b) {
b->sayMyName();
}
এটি সূক্ষ্মভাবে কাজ করে এবং মূলত যা ঘটে তা হ'ল সংকলকটি দুটি টেবিল তৈরি করে, যাকে ভিটিবেলস বলা হয় এবং ভার্চুয়াল ফাংশনগুলিতে সূচকগুলি এই জাতীয় নির্ধারণ করে
enum Base_Virtual_Functions {
sayMyName = 0;
foo = 1;
};
using VTable = void*[];
const VTable Base_VTable = {
&Base::sayMyName,
&Base::foo
};
const VTable Derived_VTable = {
&Derived::sayMyName,
&Base::foo
};
ভার্চুয়াল ফাংশন সহ প্রতিটি ক্লাসের একটি অন্য ক্ষেত্রের সাথে বাড়ানো হয় যা তার ভিটিবেলের দিকে নির্দেশ করে, তাই সংকলকটি মূলত তাদেরকে এটির মতো করে তোলে:
struct Base {
VTable* vtable;
virtual void sayMyName() {
cout << "Base\n";
}
virtual void foo() {
}
int somedata;
};
struct Derived : public Base {
VTable* vtable;
void sayMyName() override {
cout << "Derived\n";
}
};
তারপরে ফোন করলে আসলে কী ঘটে b->sayMyName()
? মূলত এটি:
b->vtable[Base_Virtual_Functions::sayMyName](b);
(প্রথম প্যারামিটারটি হয়ে যায় this
))
ঠিক আছে, সুতরাং এটি স্থির ভার্চুয়াল ফাংশনগুলির সাথে কীভাবে কাজ করবে? আচ্ছা স্থির এবং অ স্থিতিশীল সদস্য ফাংশনগুলির মধ্যে পার্থক্য কী? পার্থক্য হ'ল পরেরটি this
পয়েন্টার পায়।
আমরা স্থির ভার্চুয়াল ফাংশনগুলির সাথে ঠিক একই কাজ করতে পারি - কেবল this
পয়েন্টারটি সরিয়ে ফেলুন ।
b->vtable[Base_Virtual_Functions::sayMyName]();
এটি তখন উভয় বাক্য গঠন সমর্থন করতে পারে:
b->sayMyName(); // Prints "Base" or "Derived"...
Base::sayMyName(); // Always prints "Base".
সুতরাং সমস্ত nayayers উপেক্ষা করুন। এটা করে না। কেন তখন এটি সমর্থন করা হয় না? আমি মনে করি এটি এর কারণ খুব কম সুবিধা এবং এটি কিছুটা বিভ্রান্তিকর হতে পারে।
সাধারণ ভার্চুয়াল ফাংশনটির একমাত্র প্রযুক্তিগত সুবিধা হ'ল আপনাকে পাস করার দরকার নেই this
ফাংশনে করার তবে আমি মনে করি না যে এটি পারফরম্যান্সে কোনও পরিমাপযোগ্য পার্থক্য তৈরি করবে।
এর অর্থ এই যে আপনি যখন উদাহরণস্বরূপ উপস্থিত হন এবং ক্ষেত্রে যখন আপনার নজির নেই তখন ক্ষেত্রে পৃথক স্থিতিশীল এবং অ-স্থিতিশীল ফাংশন আপনার নেই, তবে এটি বিভ্রান্তিকর হতে পারে যে আপনি যখন ব্যবহার করবেন তখন এটি কেবল সত্যই "ভার্চুয়াল" উদাহরণ কল।
const
একটি পদ্ধতিতে স্বাক্ষরটি অন্তর্নিহিতthis
পয়েন্টারটিকে ধ্রুবক হিসাবে পতাকাঙ্কিত করে এবং স্থির পদ্ধতিতে প্রয়োগ করা যায় না কারণ এতে অন্তর্নিহিত প্যারামিটারের অভাব রয়েছে।