Запретить производным классам скрывать не виртуальные функции от базы

Считай, что у меня есть классы А & В такой, что

class A
{
public:
void Fun();
};

class B  : public A
{
....
};

Есть ли какой-нибудь способ, которым я, как разработчик класса A, мог бы принудить, чтобы производный класс B и другие классы, производные от A, были защищены (получить какую-то ошибку) от сокрытия не виртуальной функции Fun ()?

4

Решение

Если вы хотите неvirtual Функция-член всегда должна быть доступна каким-либо образом, а затем просто обернуть ее в функцию, свободную от пространства имен:

namespace revealed {
void foo( A& o ) { o.foo(); }
}

теперь клиенты класса B всегда могут сделать

void bar()
{
B o;
revealed::foo( o );
}

Однако, независимо от того, сколько класс B вводит скрытые перегрузки, клиенты также могут просто сделать

void bar2()
{
B o;
A& ah = o;
ah.foo();
}

и они могут сделать

void bar3()
{
B o;
o.A::foo();
}

так что почти все, что было получено, — это более понятная система обозначений и интенционального общения.

То есть, далеко не невозможно, поскольку в комментариях было бы, доступность — это то, что у вас есть по умолчанию …

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]