Мне задали этот сумасшедший вопрос. Я был не в своем уме.
Можно ли вызвать метод в базовом классе, объявленный как виртуальный, с использованием указателя базового класса, который указывает на объект производного класса?
Возможно ли это?
Мне задали этот сумасшедший вопрос. Я был не в своем уме.
Можно ли вызвать метод в базовом классе, объявленный как виртуальный, с использованием указателя базового класса, который указывает на объект производного класса?
Возможно ли это?
Если вы пытаетесь вызвать виртуальный метод из указателя базового класса, да.
Этот полиморфизм.
Если вы спрашиваете, указав базовый класс на производный класс, можете ли вы вызвать метод базового класса, который переопределяется производным классом? Да, это также возможно путем явного определения названия базового класса:
basePtr->BaseClass::myMethod();
Try:
class A { virtual void foo(); }
class B : public A { virtual void foo(); }
A *b = new B();
b->A::foo ();
Ты имеешь в виду нечто подобное. (Где pBase
имеет тип-указатель-к-базе, но объект с указателем на самом деле имеет тип Derived
, который получен из Base
.)
pBase->Base::method();
Да, это возможно.
Да - вам нужно указать полное имя:
#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;
}
Если я правильно понял вопрос, у вас есть
class B
{
public:
virtual void foo();
};
class D: public B
{
public:
virtual void foo();
}
B* b = new D;
И вопрос в том, можете ли вы назвать B::foo()
. Ответ: да, используя
b->B::foo()
class B
{
public:
virtual void foo();
};
class D: public B
{
public:
virtual void foo();
}
B* b = new D;
Попробуйте позвонить
(*b).foo()
для вызова функции foo базового класса
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
Нет. Не в чистом виде. Но да. Вы должны сделать некоторые манипуляции с указателями, получить указатель на vtable и сделать вызов. но это не точно указатель на базовый класс, но некоторые умные манипуляции с указателями. Другим подходом является использование оператора разрешения области по базовому классу.