公共继承是否允许覆盖基类成员访问器?

时间:2015-08-04 08:40:20

标签: c++ inheritance public protected

我在代码示例中读到了一些奇怪的东西。有一个基类和一个派生类。派生类派生自具有公共继承的基类。

class baseClass
{
public:
    void foo();
}

class derivedClass : public baseClass
{
protected:
    void foo();
}

派生类还会覆盖方法foo()的访问者。 foo()中的publicbaseClassprotectedderivedClass。它构建和工作,但我不明白为什么有人会这样做,以及这是允许的程度。例如,protected会缩小访问权限,因此允许使用public,但是您不能使用public覆盖基类保护方法?我不知道。

2 个答案:

答案 0 :(得分:3)

你写的内容有点棘手。您的代码的结果将不是您所期望的。如果您创建并使用derivedClass个实例,则无法调用foo()因为它受到保护:

derivedClass object;
object.foo(); // Compilation error. Cannot access.

但是如果你创建一个指向derivedClass类对象的指针并调用foo()函数,它将调用baseClass的{​​{1}}而不是foo()derivedClass因为它不是基类中的虚函数。

foo()

隐藏该功能时就是这种情况。如果您将baseClass* object = new derivedClass; object->foo(); // This will call baseClass::foo(); 关键字添加到virtual,则会调用foo()的{​​{1}}。

derivedClass

用法:

foo()

答案 1 :(得分:1)

可以覆盖虚拟功能。这是虚函数的要点之一。

但是,在您的示例中,derivedClass::foo()隐藏了baseClass::foo()。它不会覆盖它。

这可以证明如下

//  your class definitions here
int main()
{
     baseClass b;
     derivedClass c;
     baseClass *pb = &b;
     baseClass *pc = &c;

     b.foo();     // will call baseClass::foo()
     pb->foo();   // will also call baseClass::foo()
     pc->foo();   // will also call baseClass::foo()  (not derivedClass::foo() which would be the case if baseClass::foo() was virtual)

     c.foo();     //  will attempt to call derivedClass::foo(), which the compiler will reject since it is protected                      
}

如果c.foo()derivedClass::foo(),则public语句将进行编译,并将调用derivedClass::foo()。根据编译器和编译器设置,编译器可能会发出有关隐藏baseClass::foo()的警告。