सबसे पहले, अपने Derived::fun()
भी virtual
, एक व्युत्पन्न वर्ग में एक समारोह आधार वर्ग में एक आभासी समारोह के रूप में एक ही घोषणा है तो व्युत्पन्न वर्ग में समारोह स्वचालित रूप से virtual
हो जाता है क्योंकि है, भले ही कि स्पष्ट रूप से नहीं था निर्दिष्ट।
दूसरा, बेस क्लास से सार्वजनिक मध्यवर्ती कार्यों के माध्यम से निजी वर्चुअल फ़ंक्शंस तक पहुंचने के लिए पूरी तरह से ठीक है, उदाहरण के लिए, this answer और इसके लिंक, विशेष रूप से Virtuality by Herb Sutter। एक नमूना कोड हो सकता है की तरह
#include<iostream>
using namespace std;
class Derived;
class Base {
private:
virtual void fun() { cout << "Base Fun"; }
public:
void funInt() { fun(); }
};
class Derived: public Base {
private:
virtual void fun() { cout << "Derived Fun"; }
};
int main()
{
Base *ptr = new Derived;
ptr->funInt();
return 0;
}
तो, क्या अपने मामले में होता है, मुझे लगता है, एक ऐसी ही स्थिति है: main
ptr->fun()
का उपयोग करने की अनुमति दी है, लेकिन वास्तविकता के कारण इस fun()
Derived::fun()
होता है।
युपीडी: एक टिप्पणी
लेकिन करता है इस ध्वनि एक छोटे से खतरनाक नहीं पर विस्तार ..मेरा मतलब है, सभी कार्यों कि आधार वर्ग से निकाले जाते हैं, उनके निजी सदस्यों के लिए सुलभ बेस वर्ग के दोस्त कार्यों
नहीं, Derived
के सभी कार्यों के दोस्तों के लिए सुलभ हो जाएगा Base
, लेकिन केवल वे लोग जिन्हें Base
पॉइंटर के माध्यम से पहुंचा जा सकता है। उदाहरण के लिए:
class Base {
virtual void fun();
friend int main();
}
class Derived: public Base {
virtual void fun();
virtual void foo();
void bar();
}
केवल Derived::fun()
मुख्य से पहुँचा जा सकता है:
int main() {
Derived *ptr = new Derived;
Base* baseptr = ptr;
baseptr->fun(); // ok, calls Derived::fun()
baseptr->foo(); // error, no such function in Base
ptr->foo(); // error, foo is private
return 0;
}
ध्यान दें कि virtual
समारोह जानबूझकर एक्स्टेंसिबल हैं, और Derived
में virtual
समारोह के किसी भी ओवरराइड इसका मतलब है कि समारोह Base
के माध्यम से कहा जा सकता है सूचक; यह virtual
कार्यों का मुख्य उद्देश्य है। यदि Derived
इसके ओवरराइडिंग फ़ंक्शन private
बनाता है, तो यह अभी भी जागरूक होना चाहिए कि फ़ंक्शन को Base
पॉइंटर के माध्यम से एक्सेस किया जा सकता है, क्योंकि virtual
फ़ंक्शंस के पीछे यह मुख्य विचार है।
दोस्तों के पास निजी सदस्यों के पास acces है। आप मुख्य को दोस्त के रूप में घोषित करते हैं, इसलिए निजी सदस्यों तक पहुंच है। (आपने यह क्यों किया है यह मेरे लिए एक चमत्कार है) – user463035818
@ tobi303, मित्र के पास 'बेस' के निजी 'तक पहुंच' नहीं है और 'मजेदार()' प्रोग्राम चलाया जाने पर कॉल किया जा रहा है 'मजेदार() ' 'व्युत्पन्न 'वर्ग .. बीटीडब्ल्यू मैं सी ++ अवधारणाओं के साथ खेल रहा था, इसलिए इस पर आया .. व्यावहारिक कुछ भी नहीं .. – Haris