#include #include using namespace std; class A{ public: A(string n): name(n){}; virtual ~A() = default; virtual void Name(string n) { name = n; } virtual string Name() { return name; } virtual void ChangeName() = 0; private: string name; }; class B: public A { public: B(string n):A(n) {}; void ChangeName() override { string data = Name(); for(auto & x: data) { x = static_cast(toupper(x)); } Name( data); } }; class C: public A { public: C(string n):A(n) {}; void ChangeName() override { string data = Name(); for(auto & x: data) { x = static_cast(tolower(x)); } Name(data); } }; class D: public B, public C { public: D(string n): B(n), C(n) {}; void ChangeName() override { // this will bomb //string data = Name(); string data = "hello"; for(size_t i=0; i< data.size(); i++) { if (i%2) { data[i] = static_cast(toupper(data[i])); } else { data[i] = static_cast(tolower(data[i])); } } // this will bomb // Name(data); cout << data << endl; } }; int main() { B b("fred"); C c("Bob"); D d("DaVe"); cout << b.Name() << endl; b.ChangeName(); cout << b.Name() << endl; cout <