我有以下方案:
class Interface
{
virtual ~Interface() { }
virtual void foo() const = 0;
virtual void bar() const = 0;
}
//Interface is derived privately mostly for preventing upcast outside
class Derived : private Interface
{
public:
void foo() const;
private:
void bar() const;
}
它不编译:foo
是私有的。有没有办法在不添加虚拟公共函数的情况下将其公开?
语言而言,派生类中的公共成员函数重写基类中的私有成员函数是完全有效的。这样做是否是一个好主意是一个不同的问题。抽象基类没有公共成员函数当然没有意义。
代码的问题在于Interface
具有私有析构函数,这使得派生类无法销毁其基类子对象。 ~Interface()
要么是受保护的,要么是公开的。
不,没有。
此外,即使是虚拟的公共功能也要求基地中的foo
是protected
的,而不是private
的。
我会重新审视你的设计。如果函数是公开的,那么为什么它不public
?
不允许更改继承成员的可访问性。如果允许,您将能够从类派生并使其私有或受保护成员公开,从而破坏封装。