Подтвердить что ты не робот

Вопрос о виртуальных функциях в С++

Мне задали этот сумасшедший вопрос. Я был не в своем уме.

Можно ли вызвать метод в базовом классе, объявленный как виртуальный, с использованием указателя базового класса, который указывает на объект производного класса?

Возможно ли это?

4b9b3361

Ответ 1

Если вы пытаетесь вызвать виртуальный метод из указателя базового класса, да.

Этот полиморфизм.

Если вы спрашиваете, указав базовый класс на производный класс, можете ли вы вызвать метод базового класса, который переопределяется производным классом? Да, это также возможно путем явного определения названия базового класса:

basePtr->BaseClass::myMethod();

Ответ 2

Try:

class A            { virtual void foo(); }
class B : public A { virtual void foo(); }

A *b = new B();
b->A::foo ();

Ответ 3

Ты имеешь в виду нечто подобное. (Где pBase имеет тип-указатель-к-базе, но объект с указателем на самом деле имеет тип Derived, который получен из Base.)

pBase->Base::method();

Да, это возможно.

Ответ 4

Да - вам нужно указать полное имя:

#include <iostream>

struct base { 
    virtual void print() { std::cout << "Base"; }
};

struct derived : base {
    virtual void print() { std::cout << "Derived"; }
};

int main() { 
    base *b = new derived;
    b->base::print();
    delete b;
    return 0;
}

Ответ 5

Если я правильно понял вопрос, у вас есть

class B 
{
public: 
    virtual void foo();
};

class D: public B
{
public:
    virtual void foo();
}

B* b = new D;

И вопрос в том, можете ли вы назвать B::foo(). Ответ: да, используя

b->B::foo()

Ответ 6

class B 
{
public: 
    virtual void foo();
};

class D: public B
{
public:
    virtual void foo();
}

B* b = new D;

Попробуйте позвонить

(*b).foo()

для вызова функции foo базового класса

Ответ 7

class B { 
    public: virtual void foo(); 
};

class D: public B { 
    public: virtual void foo() 
    { 
        B::foo();
    }; 
}

B* b = new D;

Решения:

  • b->foo();
  • b->B::foo()

  • ИЛИ не переопределять/определять foo() в производном классе D и вызывать b- > foo()

  • B objb = *b; objb.foo() ; // this is object slicing and not (*b).foo() as in one of the previous answers

Ответ 8

Нет. Не в чистом виде. Но да. Вы должны сделать некоторые манипуляции с указателями, получить указатель на vtable и сделать вызов. но это не точно указатель на базовый класс, но некоторые умные манипуляции с указателями. Другим подходом является использование оператора разрешения области по базовому классу.