// MT4Q4.cpp - what happens when? #include #include class B { public: B() { pStr = new std::string("default B"); std::cout << "\n B constructed"; } B(const B& b) { pStr = new std::string(*(b.pStr)); std::cout << "\n B copied"; } virtual ~B() { delete pStr; std::cout << "\n B destroyed"; } void take(std::string str) { delete pStr; pStr = new std::string(str); } virtual const std::string say() { return *pStr; } B& operator=(const B& b) { if(&b == this) return *this; delete pStr; pStr = new std::string(*(b.pStr)); std::cout << "\n B assigned"; } private: std::string* pStr; }; class D : public B { public: // B has correct copy, assignment, and destruction // semantics so compiler generated operations for D // will be correct virtual const std::string say() { std::string temp = "from derived class: "; return temp + static_cast(this)->B::say(); } }; D someFunction(void) { std::cout << "\n D constructed with compiler generated D()"; D d; d.take("testing someFunction()"); std::cout << "\n returning D instance from someFunction()"; return d; } int main() { B b = someFunction(); std::cout << "\n " << b.say() << "\n\n"; return 0; }