Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ virtual override functions with same name

Tags:

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!

like image 549
QbProg Avatar asked Jun 30 '10 14:06

QbProg


People also ask

Is it necessary to override every virtual function?

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.

Can virtual function override?

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.

Is there any reason to mark a function virtual If you are not going to have a derived class?

No, the virtual keyword on derived classes' virtual function overrides is not required.

Can we override method without virtual keyword?

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.


2 Answers

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).

like image 122
Johannes Schaub - litb Avatar answered Sep 20 '22 20:09

Johannes Schaub - litb


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.

like image 34
user2932661 Avatar answered Sep 20 '22 20:09

user2932661