第三個版本了!居然有搞錯了。原本以為已經(jīng)理解了多分派,寫出來以后才知道問題那么多!所以說要多實踐,多和高手討論討論阿。
如果還有問題,請大家不吝賜教。謝謝哈!
#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);//問題出現(xiàn)在這里!!!如改為((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;
}