gpt4 book ai didi

c++ - 公共(public)虚函数派生在 C++ 中的私有(private)

转载 作者:IT老高 更新时间:2023-10-28 22:02:45 26 4
gpt4 key购买 nike

我试图弄清楚当派生类将虚函数声明为私有(private)时会发生什么。以下是我写的程序

#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

这是否违反了为该功能设置的私有(private)访问权限。这是预期的行为吗?这是标准的解决方法还是漏洞?通过 VTABLE 解析函数调用时是否绕过访问级别?

对此行为的任何见解都会非常有帮助。

进一步提到,私有(private)覆盖虚拟成员会阻止其他类继承它。即使这样也有问题。修改上述程序以包含:

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

最佳答案

这是定义明确的行为。如果 aB* 这将无法编译。原因是成员访问由编译器静态解析,而不是在运行时动态解析。许多 C++ 书籍建议您避免这样的编码,因为它会使经验不足的编码人员感到困惑。

关于c++ - 公共(public)虚函数派生在 C++ 中的私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1061726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com