C++ 重写方法时访问说明符

C++ 重写方法时访问说明符,c++,overriding,C++,Overriding,假设您有一个使用访问说明符public定义虚拟方法的类。 能否更改重写方法上的访问说明符? 我想不会。 正在寻找解释。是的,你可以,但它“不可靠” 看看你绝对可以。但这毫无意义。如果它是公共继承,则始终可以将对象强制转换为其基础。如果它是私有继承,则默认情况下,所有基方法都已经是私有的。在受保护继承的情况下,您可以将基方法设为私有,这样就可以防止可能的派生类调用它,但我真的不明白为什么需要它。是的,您可以,事实上,您甚至不需要重写或使用任何虚拟的东西 class ABC { public: //

假设您有一个使用访问说明符public定义虚拟方法的类。 能否更改重写方法上的访问说明符? 我想不会。 正在寻找解释。

是的,你可以,但它“不可靠”


看看

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

是的,您可以,事实上,您甚至不需要重写或使用任何虚拟的东西

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
中的特殊声明,
ABC
public
界面确实无法通过
D
访问,因为您无法向上转换到
ABC
。如果
woof
moo
virtual
,则需要将覆盖设置为private,以隐藏它们。也许这更好地回答了这个问题。

答案是:有点。您只能更改派生类有权访问的成员的访问权限。继承类型无效-这仅控制继承成员的默认访问权限(在一定程度上,遵循其他规则)

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

例如:

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:错误:在此上下文中


此外,重写与更改方法的访问权限无关。您可以重写虚拟私有方法,但不能从派生类调用它。

我很确定,如果它们在
类ABC
中是
private
,则会有很大的不同
class D
必须先访问基本成员,然后才能使用声明在
中成功命名它们。哦,它们本来可以在
ABC
中受到
保护,使用仍然有效。@Ben:对不起,我是说受到保护。已修复。但是,正如引用的parashift.com常见问题所述,这不适用于私有/受保护的继承。您也可以重写私有纯虚拟方法并将其公开(此处-),但您可以重写私有纯虚拟方法并将其公开(此处-)。