как получить доступ к защищенному члену суперкласса к его производному классу. если функция уже объявлена ​​в производном классе с тем же именем? - PullRequest
2 голосов
/ 03 октября 2019

Я хочу получить доступ к защищенному члену Суперкласса в следующем случае. Если у кого-нибудь есть идеи, пожалуйста, дайте мне знать, как мне этого добиться? Эта защищенная функция вызывает защищенную функцию из того же класса.

#include<iostream>
#include<String.h>
using namespace std;

/*Derived Class*/
class SuperParentClass
{

    protected:
        void protected_funtion()
        {
            cout << "I'm a protected function of SuperParentClass..." << endl;
        }

};

class ParentClass : public SuperParentClass
{

    public:


        void public_function(void)
        {
            cout << "I'm a public function of ParentClass..." << endl;
            protected_funtion();

        }

    protected:
        void protected_funtion()
        {
            cout << "I'm a protected function of ParentClass..." << endl;
        }

};


int main()
{
    ParentClass objParentClass;     
    objParentClass.public_function();     




    return 0;
}


Фактический результат:

I'm a public function of Parent Class...
I'm a protected function of Parent Class...

Ожидаемый результат:

I'm a public function of Parent Class...
I'm a protected function of Super Parent Class...`

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

вы можете использовать:

void public_function(void)
{
   cout << "I'm a public function of ParentClass..." << endl;
   SuperParentClass::protected_funtion();

}

Live on Godbolt

0 голосов
/ 03 октября 2019

Функция в производном классе с тем же именем, что и функции в базовом классе, скрывает функции в базовом классе.

Таким образом, вам нужно использовать квалифицированное имя для доступа к скрытой функции в базовом классе. .

Например, относительно вашего кода вы можете написать, например,

void public_function(void)
{
    cout << "I'm a public function of ParentClass..." << endl;
    protected_funtion();
    SuperParentClass::protected_funtion();
}

Если функции с одинаковыми именами различаются по своим типам (в противном случае может возникнуть неоднозначность), тогда вы можете использоватьиспользование объявлений в производном классе для представления объявлений функций в базовом классе. Например,

#include <iostream>

struct A
{
    void f() const
    {
        std::cout << "A::f()\n"; 
    }
};

struct B : A
{
    using A::f;

    void f()
    {
        std::cout << "B::f()\n"; 
    }

    void test()
    {
        f();

        const_cast<const B *>( this )->f();
    }
};

int main() 
{
    B().test();

    return 0;
}

Вывод программы:

B::f()
A::f()

Здесь без объявления использования в классе B функция f, объявленная в родительском классе A, скрывается объявлением функции сто же имя в производном классе B.

Объявление using позволяет сделать видимой функцию f, объявленную в классе A в области видимости производного класса B.

...