我想要打印代码:
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)
你没有method1用适当的参数覆盖它,所以它继续method1在Item课堂上调用.
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类中被适当地重写,因此当通过实际指向子类对象的指针调用它们时会调用它们.
| 归档时间: |
|
| 查看次数: |
2457 次 |
| 最近记录: |