4

考虑到我有 A 和 B 类,这样

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

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

作为A类的设计者,有什么方法可以强制派生类B和其他从A派生的类被阻止(出现某种错误)隐藏非虚函数Fun()?

4

1 回答 1

3

如果您希望非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();
}

所以所获得的只是更容易理解的符号和意图通信。

即,远非不可能,正如评论所言,可用性是您默认拥有的......

于 2013-02-21T08:15:43.487 回答