Path: utzoo!utgpu!jarvis.csri.toronto.edu!clyde.concordia.ca!uunet!microsoft!jimad From: jimad@microsoft.UUCP (JAMES ADCOCK) Newsgroups: comp.lang.c++ Subject: virtual assignment operator is possible? Keywords: assignment operator, virtual function Message-ID: <10138@microsoft.UUCP> Date: 3 Jan 90 22:39:16 GMT References: <1989Dec30.174745.8174@sdr.slb.com> <10137@microsoft.UUCP> Reply-To: jimad@microsoft.UUCP (JAMES ADCOCK) Organization: Microsoft Corp., Redmond WA Lines: 68 //saito: //>Suppose I have a base class B, and its derived class D. In each class, //>I defined assignment operator, i.e, X& operator=(X&). Then, //consider: #include #include #include "new.h" class B { char* bp; public: virtual B& assignTo(B& b) const { b.bp = bp; return b; } B(char* id="B") { bp = id; } B(const B& b) { bp = b.bp; } virtual B& operator=(const B& b) { return b.B::assignTo(*this); } virtual void Print(char sep='\n') { printf(bp); putchar(sep); } }; class D : public B { char* dp; protected: virtual B& assignTo(B& b) const { (*(D*)&b).dp = dp; return B::assignTo(b); } //(except not with MI virtual bases) public: D(char* bid="B", char* did="D") : B(bid) { dp = did; } D(const B& b) : B(b) { dp = "D"; } D(const D& d) : B(d) { dp = "D"; } virtual B& operator=(const B& b) { dp = "?"; return b.assignTo(*this); } virtual D& operator=(const D& d) { return *(D*)&(d.D::assignTo(*this)); } //(ditto) virtual void Print(char sep='\n') { B::Print(' '); printf(dp); putchar(sep); } }; int main() { B* pb0 = new B("b0"); B* pb1 = new B("b1"); D* pd0 = new D("db0","d0"); D* pd1 = new D("db1","d1"); *pb1 = *pb0; // B& B::operator=(B&) is invoked. pb1->Print(); *pd1 = *pd0; // D& D::operator=(D&) is invoked. pd1->Print(); //This is perfectly fine. However: B* pdb2 = new D("db2","d2"); B* pdb3 = new D("db3","d3"); *pdb2 = *pdb3; //B& D::operator=(B&) is invoked. No problem. pdb2->Print(); // But what should we do if someone tries to assign a B to a D ? B* pdb4 = new D("db4","d4"); B* pb5 = new B("b5"); *pdb4 = *pb5; pdb4->Print(); return 0; }