Я не эксперт по Delphi, но могу объяснить, как эти вещи ведут себя в C ++.
Таким образом, в C ++ у вас может быть класс, который определяет функцию virtual
, что означает, что если вы используете указатель базового класса / ссылку на объект, эта функция может быть вызвана посредством динамической диспетчеризации (т. Е. Поиска функции времени выполнения) .
#include <iostream>
class BaseClass
{
public:
virtual void virtFunc() { std::cout << "BaseClass\n"; } // notice the 'virtual' keyword
void nonvirtFunc() { std::cout << "BaseClass\n"; }
};
class SubClass : public BaseClass
{
public:
virtual void virtFunc() { std::cout << "SubClass\n"; }
void nonvirtFunc() { std::cout << "SubClass\n"; }
};
int main()
{
// You need to use base class pointers/references
SubClass sc = SubClass();
BaseClass *bcp = ≻
bcp->virtFunc(); // prints "SubClass"
bcp->nonvirtFunc(); // prints "BaseClass"
// doing it by allocating an object on heap
BaseClass *dbcp = new SubClass();
dbcp->virtFunc(); // prints "SubClass"
dbcp->nonvirtFunc(); // prints "BaseClass"
delete dbcp; // in a real program, you should have a virtual destructor which will be called from this code
BaseClass bc = SubClass();
bc.virtFunc(); // prints "BaseClass", and in more complex objects, slicing occurs
}
Новый код, который вы разместили
Я вижу, что вы обновили свой код, который делает это:
((Pai)filho).metodoX();
Поэтому, когда вы делаете это, вы не используете указатели / ссылки на базовый класс. Вы просто приводите объект filho
к объекту Pai
. Это не приводит к полиморфному вызову функции, а просто вызывает функцию Pai::metodoX()
.
Если вы сделали это вместо:
((Pai*)filho)->metodoX();
Это вызовет Filho
metodoX()
полиморфно.