C ++ Polymorphism

I want my code to print:

B B
A B
B A

But he is typing

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]);
}
+3
source share
5 answers

Your overload method1in Bnot override the virtual method in the Item. Therefore, when you call someItem->method1, he will not use them.

It looks like you want the so-called "multiple sending", which C ++ does not directly support. See http://en.wikipedia.org/wiki/Multiple_dispatch#C.2B.2B for a discussion and workarounds.

+4
source

You do not override method1with the appropriate parameters so that it continues to be called method1in the class 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), Base 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

1() , method2() & method3() ` Child, , , , .

+5

a - Item. , , . , , , Item, , .

+4

. . . , . , .

0

, . , Item. multimethod, ++, .

0

All Articles