Bernd
Bernd

Reputation: 2221

Namehiding and overriding - Is there a way to make a function explicitly not overriding

I would like to hide a virtual method instead of override. I know for historic / compatibility reasons the override specifier is optional and overriding happens implicitly. To stop overriding I usually adjusted the signature by adding a defaulted "Dummy" parameter. Is there a better way?

Assume this code:

#include <iostream>

class A{
public:
    virtual void Foo()
    {
        std::cout << "A::Foo";
    }
};

class B : public A
{
public:
    void Foo() /*not override, just hide*/
    {
        std::cout << "B::Foo";
    }
};

int main()
{
    B b{};
    A& a = b;
    a.Foo(); //should print A::Foo - but prints B::Foo
}

What I did so far is this:

#include <iostream>

class A{
public:
    virtual void Foo()
    {
        std::cout << "A::Foo";
    }
};

template<typename T>
class reintroduce{};

class B : public A
{
public:
    void Foo(reintroduce<B> = {}) /*not override, just hide*/
    {
        std::cout << "B::Foo";
    }
};

int main()
{
    B b{};
    A& a = b;
    a.Foo(); //should print A::Foo
}

Upvotes: 0

Views: 77

Answers (1)

dxiv
dxiv

Reputation: 17678

The question is not too clear on the requirements of "hiding" but the following effectively "hides" the inherited method in the derived class, while not changing its visibility/accessibility in the base class.

#include <iostream>

class A {
public:
    virtual void Foo()
    {   std::cout << "A::Foo"; }
};

class B : public A
{
private:
    using A::Foo;
};

int main()
{
    B b;
    b.Foo();     // error, cannot access private member
    b.A::Foo();  // ok, calls A::Foo

    A& a = b;
    a.Foo();     // ok, calls A::Foo
}

Upvotes: 0

Related Questions