I have something like that (simplified)
class A { public: virtual void Function () = 0; }; class B { public: virtual void Function () = 0; }; class Impl : public A , public B { public: ???? };
How can I implement the Function () for A and the Function() for B ? Visual C++ lets you only define the specific function inline (i.e. not in the cpp file), but I suppose it's an extension. GCC complains about this. Is there a standard C++ way to tell the compiler which function I want to override?
(visual c++ 2008)
class Impl : public A , public B { public: void A::Function () { cout << "A::Function" << endl; } void B::Function () { cout << "B::Function" << endl; } };
Thank you!
The virtual keyword can be used when declaring overriding functions in a derived class, but it is unnecessary; overrides of virtual functions are always virtual. Virtual functions in a base class must be defined unless they are declared using the pure-specifier.
Virtual functions are member functions whose behavior can be overridden in derived classes. As opposed to non-virtual functions, the overriding behavior is preserved even if there is no compile-time information about the actual type of the class.
No, the virtual keyword on derived classes' virtual function overrides is not required.
You cannot override a non-virtual or static method. The overridden base method must be virtual , abstract , or override . An override declaration cannot change the accessibility of the virtual method. Both the override method and the virtual method must have the same access level modifier.
You cannot use qualified names there. I you write void Function() { ... }
you are overriding both functions. Herb Sutter shows how it can be solved.
Another option is to rename those functions, because apparently they do something different (otherwise i don't see the problem of overriding both with identical behavior).
I can suggest another way to resolve this issue. You can add wrapper Typed
which changes Function
signature by adding dummy parameter. Thus you can distinguish methods in your implementation.
class A { public: virtual void Function() = 0; virtual ~A() = default; }; class B { public: virtual void Function() = 0; virtual ~B() = default; }; template<typename T> class Typed : public T { public: virtual void Function(T* dummy) = 0; void Function() override { Function(nullptr); } }; class Impl : public Typed<A>, public Typed<B> { public: void Function(A* dummy) override { std::cerr << "implements A::Function()" << std::endl; } void Function(B* dummy) override { std::cerr << "implements B::Function()" << std::endl; } };
The benefit of such solution is that all implementation are placed in one class.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With