Вы не переопределяете method1
с соответствующими параметрами, поэтому он продолжает вызывать method1
в Item
классе.
Item * a[2];
Итак *a[0]
& *a[1]
оба имеют тип Item
. Это вызывает ваши звонки:
a[0]->method1(*a[0], *a[0]);
a[0]->method1(*a[1], *a[0]);
a[0]->method1(*a[0], *a[1]);
как вызовы method1(Type,Type)
, который определен в базовом Item
классе.
Вы должны переопределить этот метод с помощью same parameters
в своих дочерних классах, чтобы иметь возможность вызывать методы в дочернем классе.
Вот что, я думаю, вы пытаетесь сделать:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
struct Item {
Item(){}
virtual void method1 (Item x, Item y) {cout << "Item Item\n";}
virtual void method2 (Item x, Item y) {cout << "Item Item\n";}
virtual void method3 (Item x, Item y) {cout << "Item Item\n";}
};
struct A : public Item {
A(){}
};
struct B : public Item {
B(){}
virtual void method1 (Item x, Item y) {cout << "B B\n";}
virtual void method2 (Item x, Item y) {cout << "A B\n";}
virtual void method3 (Item x, Item y) {cout << "B A\n";}
};
int main ( void )
{
Item * a[2];
a[0] = new B; a[1] = new A;
a[0]->method1(*a[0], *a[0]);
a[0]->method2(*a[1], *a[0]);
a[0]->method3(*a[0], *a[1]);
}
Это даст вам желаемый результат:
output:
B B
A B
B A
Здесь method1 () ,
method2 () &
method3 () `соответствующим образом переопределены в классе Child и, следовательно, они вызываются при вызове через указатель, фактически указывающий на объект дочернего класса.