多态性C++

Nik*_*íša 3 c++ polymorphism

我想要打印代码:

B B
A B
B A
Run Code Online (Sandbox Code Playgroud)

但它打印

Item Item
Item Item
Item Item
Run Code Online (Sandbox Code Playgroud)

代码:

#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]);
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 5

你没有method1用适当的参数覆盖它,所以它继续method1Item课堂上调用.

Item * a[2];
Run Code Online (Sandbox Code Playgroud)

所以*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]);
Run Code Online (Sandbox Code Playgroud)

作为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]);
}
Run Code Online (Sandbox Code Playgroud)

这将为您提供所需的输出:

output:
B B
A B
B A
Run Code Online (Sandbox Code Playgroud)

这里,method1()方法2 ,()方法&3()`在Child类中被适当地重写,因此当通过实际指向子类对象的指针调用它们时会调用它们.