#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: virtual public A { public: B(string n, string t="Sir B"):A("B-"+n),title(t) {}; void ChangeName() override { string data = Name(); for(auto & x: data) { x = static_cast(toupper(x)); } Name( data); } private: string title; }; class C: virtual public A { public: C(string n):A("C-"+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: // this will fail //D(string n): B("D-"+n), C("D-"+n) {}; D(string n):A("D-"+n), B("D-"+n), C("D-"+n) {}; void ChangeName() override { string data = Name(); 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])); } } 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 <