Почему я получаю ошибку времени компиляции, когда указатель базового класса указывает на виртуальную функцию производного класса, которая объявлена ​​в базовом классе? - PullRequest
1 голос
/ 15 марта 2019

У меня есть базовый класс с виртуальной функцией void function1 (), который переопределяется в производном классе. Кроме того, в моем производном классе есть еще одна виртуальная функция, как показано ниже.

class Base
{
    public:
    virtual void function1()
    {
        cout<<"Base::Virtual function1"<<endl;
    }

};
class Derived1:public Base
{
    public:
    void function1()
    {
        cout<<"Derived1::Function1"<<endl;
    }
    virtual void function2()
    {
        cout<<"Derived1::function2"<<endl;

    }
};
int main()
{       
    Base *bptr = new Derived1();
    Derived1 *dptr = new Derived2();
    bptr->function2(); //compile time error

    return 0;
}

Я хочу знать, что происходит во время компиляции, что вызывает ошибку во время компиляции. Я хочу получить ответ с точки зрения интервью. Как ведут себя Vtable и Vptr в этом сценарии. Я знаю, что будет один vptr для базового класса, который будет унаследован от класса Derived1. Что проверяет компилятор во время компиляции?

Ответы [ 2 ]

3 голосов
/ 15 марта 2019

В базовом классе Base у вас нет виртуального function2, поэтому, если вы используете "Base" в качестве компилятора типов, вы не сможете найти function2.

Изменить на:

class Base
{
    public:
    virtual void function1()
    {
        cout<<"Base::Virtual function1"<<endl;
    }

    virtual void function2() = 0;

};

И вы можете использовать функцию2. Существует еще одна ошибка, так как у вас нет Derived2

1 голос
/ 15 марта 2019

Компилятор не отслеживает тип времени выполнения bptr и вместо этого всегда считает, что он указывает на экземпляр Base. Вы также должны объявить function2 в Base, чтобы компилятор подтвердил это. Кроме того, не должен ли function1 в Derived быть объявлен виртуальным, как в базовом классе?

...