我试图找出当派生类将虚拟函数声明为私有时会发生什么.以下是我写的程序
#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;
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是(对我来说)输出是:
B constructor called
B::func called
Run Code Online (Sandbox Code Playgroud)
这不是违反该功能的私人访问集.这是预期的行为吗?这是标准的解决方法还是漏洞?通过VTABLE解析函数调用时是否绕过了访问级别?
对此行为的任何了解都会非常有帮助.
此外,有人提到私有覆盖虚拟成员会阻止进一步的类继承它.即使这有问题.修改上述程序包括:
class C: public B
{
public:
void func() {
cout<<"C::func called"<<endl;
}
};
Run Code Online (Sandbox Code Playgroud)
以及主要的测试程序:
int main()
{
A *a = new …Run Code Online (Sandbox Code Playgroud)