Ключевое

Явное разрешение имен (explicit name resolution) в C++ позволяет обращаться к скрытым методам и членам базового класса в производном классе.


Использование :: оператора:

  • Оператор разрешения области видимости (::) используется для явного указания на метод или член базового класса.

Пример:

#include <iostream>
 
class Base {
public:
    void show() {
        std::cout << "Base class show() method" << std::endl;
    }
};
 
class Derived : public Base {
public:
    void show() {
        std::cout << "Derived class show() method" << std::endl;
    }
 
    void callBaseShow() {
        Base::show(); // Явный вызов метода базового класса
    }
};
 
int main() {
    Derived derivedObj;
    derivedObj.show();       // Вывод: Derived class show() method
    derivedObj.callBaseShow(); // Вывод: Base class show() method
 
    return 0;
}

Явное разрешение имен для конструкторов:

  • Конструкторы базового класса могут быть явно вызваны в списке инициализации конструктора производного класса.
class Base {
public:
    Base(int value) {
        std::cout << "Base class constructor with value: " << value << std::endl;
    }
};
 
class Derived : public Base {
public:
    Derived(int value) : Base(value) { // Явный вызов конструктора базового класса
        std::cout << "Derived class constructor" << std::endl;
    }
};
 
int main() {
    Derived derivedObj(42); // Вывод: Base class constructor with value: 42
                            //        Derived class constructor
 
    return 0;
}

Явное разрешение имен для скрытых членов:

  • Если производный класс скрывает члены базового класса, можно использовать оператор :: для явного доступа к ним.
#include <iostream>
 
class Base {
public:
    int value;
    Base(int v) : value(v) {}
};
 
class Derived : public Base {
public:
    int value; // Скрывает член value базового класса
    Derived(int baseValue, int derivedValue) : Base(baseValue), value(derivedValue) {}
 
    void showValues() {
        std::cout << "Derived class value: " << value << std::endl;
        std::cout << "Base class value: " << Base::value << std::endl; // Явный доступ к скрытому члену базового класса
    }
};
 
int main() {
    Derived derivedObj(10, 20);
    derivedObj.showValues(); // Вывод: Derived class value: 20
                             //        Base class value: 10
 
    return 0;
}