I’d like my code to print:
B B
A B
B A
But it prints
Item Item
Item Item
Item Item
The code:
#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";}
};
struct A : public Item {
A(){}
};
struct B : public Item {
B(){}
virtual void method1 (B x, B y) {cout << "B B\n";}
virtual void method1 (A x, B y) {cout << "A B\n";}
virtual void method1 (B x, A 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]->method1(*a[1], *a[0]);
a[0]->method1(*a[0], *a[1]);
}
Your overloads of
method1inBdon’t override the virtual method inItem. So, when you callsomeItem->method1, it is not going to use them.It looks like you want what is called “multiple dispatch”, which C++ doesn’t support directly. See http://en.wikipedia.org/wiki/Multiple_dispatch#C.2B.2B for some discussion and workarounds.