重写方法时访问说明符

时间:2010-04-19 22:54:57

标签: c++ override

假设您有一个使用访问说明符public定义虚方法的类。 你能改变覆盖方法的访问说明符吗? 我假设没有。 寻找解释。

4 个答案:

答案 0 :(得分:6)

答案是:有点。您只能更改派生类有权访问的成员的访问权限。继承类型没有效果 - 这只控制继承成员的默认访问权限(遵循其他规则)。

因此,您可以将基类的受保护成员设为公共或私有;或基地的公共成员受保护或私人。但是,您不能将基地的私人成员公开或受到保护。

示例:

class Foo
{
protected:
        void protected_member();

private:
        void private_member();

public:
        void public_member();
};

class Bar : private Foo
{
public:
        using Foo::protected_member;
        using Foo::private_member;
        using Foo::public_member;
};

int main(int, const char**)
{
        Bar bar;

        return 0;
}

上面的代码在g ++ 4.1.2上引发了以下错误:

main.C:7:错误:'void Foo :: private_member()'是私有的

main.C:14:错误:在此上下文中

此外,覆盖与更改方法的访问权限无关。您可以覆盖虚拟私有方法,您无法从派生类中调用它。

答案 1 :(得分:4)

是的,你可以,但它“不会gro”。

查看Overriding public virtual functions with private functions in C++

答案 2 :(得分:2)

你绝对可以。但这没有任何意义。如果它是公共继承,那么您始终可以将对象强制转换为其基础。如果它是私有继承,则默认情况下所有基本方法都是私有的。如果是受保护的继承,您可以将基本方法设为私有,这样可以防止可能的派生类调用它,但我真的不明白为什么可能需要它。

答案 3 :(得分:0)

是的,你可以,事实上你甚至不需要覆盖或使用虚拟任何东西。

class ABC {
public: // or this may be protected, no difference
    void woof();
    void moo();
};

class D : private ABC { // now woof and moo are private
public:
    using ABC::woof; // using declaration to make woof public again
    ABC::moo; // access declaration (deprecated) does the same
};

如果它们也是虚拟的,那同样有效。或者,正如其他人所指出的,虚函数查找忽略了实现类指定的访问;您可以强制转换的任何类都可以在编译时提供访问权限。

另一方面,如果D中没有特殊声明,public的{​​{1}}界面确实无法通过ABC访问,因为您无法向D转发。如果ABCwoofmoo,您可能需要使用覆盖virtual来隐藏它们。或许更好地回答了这个问题。