مخفی ساختن متد کلاس پایه در کلاس فرزند. - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مخفی ساختن متد کلاس پایه در کلاس فرزند.

0 امتیاز
سلام. همانطور که در عنوان سوال ذکر کردم چطور متدی را که در کلاس پایه تعریف کردم در کلاس فرزند مخفی باشه .آیا باید متد را virtual تعریف کنم؟
سوال شده مرداد 28, 1399  بوسیله ی .bahman (امتیاز 137)   3 18 24
دوباره تگ گذاری شد مرداد 28, 1399

2 پاسخ

+4 امتیاز
 
بهترین پاسخ

سلام.نیازی به virtual کردن نیست با استفاده از using در بخش private دوباره معرفیش کنید برای مثال:

class Parent{
    public:
       void foo(){}
};
class Child : public Parent{
    public:
    private:
        using Parent::foo;
};
int main()
{
    Child c;
    c.foo();//private here

    return 0;
}

 

پاسخ داده شده مرداد 30, 1399 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
انتخاب شد مرداد 30, 1399 بوسیله ی .bahman
لطفاً این حرکات خبیثانه رو آموزش ندید، معمولاً نباید یه همچین چیزی نیاز بشه مگر در APIها که اونم اگه مهم باشه اینکار شدیداً غلط هست چون شما می‌تونید با تبدیل کردن کلاس Child به Parent به اون عضو دسترسی داشته باشید.

بهتره که حتماً در کلاس Parent عضو به‌صورت private تعریف بشه یا اینکه به‌صورت private از کلاس Parent ارث‌بری بشه.
یعنی چی حرکت خبیثانه؟مثلا دارید شوخی می کنید! شوخیشم بی مزه است.طرف آزاده از کلاس parent‌استفاده کنه کسی هم نگفت چطور در کل هایراکی مخفیش کنیم به صراحت در عنوان سوال مطرح شده در سطح کلاس فرزند.قراره سوال دیگران  رو جواب بدیم نه هر چیزی که به ذهنمون میرسه.
نه شوخی نکردم، کسی که سوألی می‌پرسه یعنی اینکه نیاز به توضیحی داره در مورد مشکلش. وقتی فرد توی مشکل خودش غوطه‌ور میشه توی سوأل پرسیدن هم به سمت XYProblem هدایت میشه. همیشه نیازی نیست که ربات‌وار دقیقاً سوألی که پرسیده شده رو جواب داد باید مشکلی که مطرح شده رو حل کرد تا فردی که دچار مشکل شده الکی به بی‌راهه نره (البته اگر قصد کمک کردن هست، درغیر این‌صورت بله درست می‌فرمایید).
با اجازه دوستان چون سوال من بود ورود کردم @mg_ramezani دوست عزیز شما جواب خودتو بده چیکار داری به دیگران تیکه میندازی من دقیقا دنبال همین روشی که @farnoosh گفت بودم  در مورد جواب شما واقعیت بخش اول جواب شما واضحات بود و بخش دوم را هم اشتباه توضیح دادید.
مرسی، خوشحال می‌شم اون قسمتی که اشتباه توضیح دادم رو اصلاحش کنید تا نفرات بعدی که پست رو می‌خونند به اشتباه متوجه نشند.

به این صورت  که در اینجا نمونه c به متد foo دسترسی نداره


struct Parent{
    virtual void foo(){
        cout << "i am public method in parent." << endl;
    }
};
struct Child :public Parent{
  private:
    virtual void foo()override{
        cout << "i am private method in child." << endl;
    }
};

int main()
{
    
    Parent p;
    Child c;
    p.foo();
    c.foo();
    

    return 0;
}

 

درسته، و این مثال کاملاً متفاوت با چیزی هست که توی پاسخ اومده.
چه ربطی داره به پاسخ؟!! شما گفتی خوشحال میشم کسی اصلاحش کنه تا نفرات بعدی اشتباه متوجه نشن, نوشتمش
0 امتیاز
سلام؛ درصورتی‌که نوع دسترسی اون عضو `private` باشه دیگه نمی‌تونید توی کلاس پایه ازش استفاده‌ای داشته باشید و باید حتماً یا `friend` کلاس باشید یا اینکه توی خود کلاس باشید که بتونید ازش استفاده کنید.

و توابع `virtua` حالت Dynamic polymorphism هستند، به این‌صورت که شما رفتاری رو تعریف می‌کنید که ‌می‌تونه توسط بقیهٔ استفاده کنندگان تغییر کنه و برای مخفی‌سازی نیست.
پاسخ داده شده مرداد 30, 1399 بوسیله ی mg_ramezani (امتیاز 727)   1 1 12
...