Считай, что у меня есть классы А & В такой, что
class A
{
public:
void Fun();
};
class B : public A
{
....
};
Есть ли какой-нибудь способ, которым я, как разработчик класса A, мог бы принудить, чтобы производный класс B и другие классы, производные от A, были защищены (получить какую-то ошибку) от сокрытия не виртуальной функции Fun ()?
Если вы хотите не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();
}
так что почти все, что было получено, — это более понятная система обозначений и интенционального общения.
То есть, далеко не невозможно, поскольку в комментариях было бы, доступность — это то, что у вас есть по умолчанию …
Других решений пока нет …