我在代码示例中读到了一些奇怪的东西。有一个基类和一个派生类。派生类派生自具有公共继承的基类。
class baseClass
{
public:
void foo();
}
class derivedClass : public baseClass
{
protected:
void foo();
}
派生类还会覆盖方法foo()
的访问者。 foo()
中的public
为baseClass
,protected
为derivedClass
。它构建和工作,但我不明白为什么有人会这样做,以及这是允许的程度。例如,protected会缩小访问权限,因此允许使用public,但是您不能使用public覆盖基类保护方法?我不知道。
答案 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()
的警告。