第三个版本了!居然有搞错了。原本以为已经理解了多分派,写出来以后才知道问题那么多!所以说要多实践,多和高手讨论讨论阿。
如果还有问题,请大家不吝赐教。谢谢哈!
#include <iostream>
#include <list>
using namespace std;
//B
class B
{
};
class BE : public B
{
};
//A
class A
{
public:
void virtual output(B * b){cout << "A:B" << endl;}
void virtual output(BE * b){cout << "A:BE" << endl;}
};
class AD : public A
{
public:
void output(B * b){cout << "AD:B" << endl;}
void output(BE * b){cout << "AD:BE" << endl;}
};
int main()
{
A * pA = new AD;
pA->output(new BE);
list<B*> * listb = new list<B*>();
listb->push_back(new BE);
pA->output(listb->back());
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
以下有问题!!
居然写错了!哈哈。谢谢各位大哥的评论阿。这个代码是我以前写的,我还以为是正确的。。。晕了。哈哈
下面的代码是改过以后的,不知道还有没有问题?希望各位多提意见哈
#include <iostream>
using namespace std;
//B
class B
{
public:
virtual void print()
{cout << "B" << endl;}
};
class BE : public B
{
public:
void print()
{cout << "BE" << endl;}
void print(int i)
{cout << "BE:" << i << endl;}
};
//A
class A
{
public:
void output(int i)
{
B * b = new B;
B * be = new BE;
b->print();
be->print();
be->print(i);//问题出现在这里!!!如改为((BE*)be)->print(i)就OK了。
}
};
int main()
{
A a;
a.output(99);
return 0;
}
--------------------Configuration: test - Debug--------------------
Compiling source file(s)...
test.cpp
test.cpp: In member function `void A::output(int)':
test.cpp:29: error: no matching function for call to `B::print(int&)'
test.cpp:8: note: candidates are: virtual void B::print()
test.exe - 2 error(s), 0 warning(s)
//////////////////////////////////////////////////////////////////////////////////////////////////////
以下代码有问题!
//////////////////////////////////////////////////////////////////////////////////////////////////////
c++不支持双分派(double dispatch)和多分派(multi-dispatch),只支持单分派(single dispatch)。一个典型的不支持双分派的例子如下所示:
#include <iostream>
using namespace std;
class B
{
public:
virtual void print()
{cout << "c" << endl;}
};
class E1 : public B
{
public:
void print()
{cout << "E1" << endl;}
};
class E2 : public B
{
public:
void print()
{cout << "E2" << endl;}
};
class A
{
public:
virtual void output(B* p)
{cout << "A" << endl;p->print();}
};
class D1 : public A
{
public:
void output(B* p)
{cout << "D1" << endl;p->print();}
};
class D2 : public A
{
public:
void output(B* p)
{cout << "D2" << endl;p->print();}
};
void f(A* p, B* q)
{
p->output(q);
}
int main()
{
A * pd1 = new D1;
B * pe1 = new E1;
f(pd1, pe1);
end:
int end;
cin >> end;
return 0;
}