Путаница в отношении сокрытия имен и виртуальных функций

Ссылка на другой поэтому вопрос

Рассмотрим код:

class Base {
public: 
    virtual void gogo(int a){
        printf(" Base :: gogo (int) \n");
    };

    virtual void gogo(int* a){
        printf(" Base :: gogo (int*) \n");
    };
};

class Derived : public Base{
public:
    virtual void gogo(int* a){
        printf(" Derived :: gogo (int*) \n");
    };
};

int main(){

    // 1)       
    Derived * obj = new Derived ; 
    obj->gogo(7);  // this is illegal because of name hiding


    // 2)      
    Base* obj = new Derived ;
    obj->gogo(7); // this is legal
}

Для случая 2)

Вызов obj->gogo(7)разрешается во время выполнения.

Так как obj->gogo(7)допустимо. Кажется, подразумевается, что vtable из Derivedсодержит указатель на virtual void gogo(int a)которые должны были быть скрыты.

Меня смущает то, что, поскольку сокрытие имени делает случай 1)недопустимым, то как вызов в 2)разрешается во время выполнения

a)Содержит ли vtable of Derived указатель на gogo(целое).

b)Если a)не равно True, разрешение вызовов для виртуальных функций переходит к vtable базового класса.

6
задан Community 23 May 2017 в 11:59
поделиться