#include class type_one { }; class type_two { }; class i_one { public: virtual void set (const type_one & val, int id) = 0; }; class i_two { public: virtual void set (const type_two & val) = 0; }; class i_one_two:public i_one, public i_two { }; class OneTwo:public i_one_two { public: void set (const type_one & val, int id) { std::cout << "type_one value, id = " << id; } void set (const type_two & val) { std::cout << "type_two value\n"; } }; int main () { OneTwo ot; i_one_two *i12 = &ot; i12->set(type_one (), 111); // error: request for member ‘set’ is ambiguous i12->set(type_two ()); // error: request for member ‘set’ is ambiguous return 0; } //============================== main.cpp: In function ‘int main()’: main.cpp:52:8: error: request for member ‘set’ is ambiguous i12->set(type_one (), 111); ^~~ main.cpp:20:16: note: candidates are: virtual void i_two::set(const type_two&) virtual void set (const type_two & val) = 0; ^~~ main.cpp:14:16: note: virtual void i_one::set(const type_one&, int) virtual void set (const type_one & val, int id) = 0; ^~~ main.cpp:53:8: error: request for member ‘set’ is ambiguous i12->set(type_two ()); ^~~ main.cpp:20:16: note: candidates are: virtual void i_two::set(const type_two&) virtual void set (const type_two & val) = 0; ^~~ main.cpp:14:16: note: virtual void i_one::set(const type_one&, int) virtual void set (const type_one & val, int id) = 0; ^~~