Sandeep
Sandeep

Reputation: 1401

Suppressing the virtuality of a C++ function in a class hierarchy

This is purely a theoretical question. I don't have a particular use case in mind.

Can the virtuality of a C++ function be suppressed somewhere down the class hierarchy, or is it that once a virtual function is defined in a base class, it remains virtual down the rest of its class hierarchy?

I wrote some sample code where I was attempting to suppress the virtuality of a method defined up the class hierarchy but I did not succeed. My sample code follows:

class Base {
public:
  virtual void myFunc() {
    std::cout << "myFunc in Base" << std::endl;
  }
};
 
class Child : public Base {
public:
  void myFunc() {
  std::cout << "myFunc in Child" << std::endl;
  }
};
 
class GrandChild : public Child {
public:
  void myFunc() {
  std::cout << "myFunc in GrandChild" << std::endl;
  }
};



int main() {
  Base* ptr = new GrandChild();
  ptr->myFunc();
  return 0;
}

The output is as follows:

myFunc in GrandChild

Upvotes: 1

Views: 94

Answers (1)

SoronelHaetir
SoronelHaetir

Reputation: 15164

One thing you can do is create a member with a different signature (even using defaulted arguments).

That is:

struct Base
{
    virtual void foo()
    {
        std::cout << "Base::foo" << std::endl;
    }
};
struct Derived : Base
{
    void foo(int = 0)
    {
        std::cout << "Derived::foo" << std::endl;
    }
};
...
Base * ptr = new Derived;
ptr->foo(); // will invoke Base::foo()

Upvotes: 1

Related Questions