【发布时间】:2021-10-22 11:36:57
【问题描述】:
我试图弄清楚当派生类将虚函数声明为私有时会发生什么。以下是我写的程序
#include <iostream>
using namespace std;
class A
{
public:
virtual void func() {
cout<<"A::func called"<<endl;
}
private:
};
class B:public A
{
public:
B()
{
cout<<"B constructor called"<<endl;
}
private:
void func() {
cout<<"B::func called"<<endl;
}
};
int main()
{
A *a = new B();
a->func();
return 0;
}
令人惊讶的是(对我来说)输出是:
B constructor called
B::func called
这是否违反了为该功能设置的私有访问权限。这是预期的行为吗?这是标准的解决方法还是漏洞?通过 VTABLE 解析函数调用时是否绕过访问级别?
对此行为的任何见解都会非常有帮助。
进一步提到,私有覆盖虚拟成员会阻止其他类继承它。即使这样也有问题。修改上述程序以包含:
class C: public B
{
public:
void func() {
cout<<"C::func called"<<endl;
}
};
和主测试程序:
int main()
{
A *a = new C();
a->func();
return 0;
}
输出是:
C::func called
【问题讨论】:
-
我只是想指出一个不能在java中做到这一点。当一个方法被覆盖时,它的访问级别必须等于或高于被覆盖的方法的公共访问级别。原因是您必须确保可以从可以调用超类版本的所有上下文中调用子类版本的方法。我觉得有趣的是,这在 C++ 中是允许的。
-
好吧..可以说如果你一心想 C++,C++ 允许你上吊。
标签: c++ inheritance virtual-functions