gpt4 book ai didi

c++ - 虚函数破坏私有(private)访问

转载 作者:太空狗 更新时间:2023-10-29 23:42:09 26 4
gpt4 key购买 nike

我最近在 IBM site 上看到这篇文章.下面是示例代码

#include "iostream"

class B {
public:
virtual void f()
{
std::cout<<"\n In class B";
}
};

class D : public B {
private:
int i;

void f()
{
std::cout<<"\n In class D i = "<<i;
}
public:
D(int i_num):i(i_num)
{}
};

int main() {
D dobj(10);
B* bptr = &dobj;
D* dptr = &dobj;

// valid, virtual B::f() is public,
// D::f() is called
bptr->f();

// error, D::f() is private
//dptr->f();
}

我们现在可以调用 D 的私有(private)函数了。我想知道这是否会破坏 C++ 封装?

附言:请转到虚拟功能中的虚拟功能访问部分。我不知道为什么我在粘贴时没有得到准确的链接。

最佳答案

调用 bptr->f() 在运行时根据 bptr 指向的对象类型进行评估。在编译时,编译会将 bptr->f() 调用视为对 B::f() 的调用,并且自从 B::f()public 编译器不只报告错误。只有在运行时才会评估实际函数调用 D::f()

这不会破坏封装原则,这是 C++ 的一个特性,称为运行时多态性动态多态性

您不能直接调用 dptr->f(),因为 D::f() 是在 Private 访问说明符下声明的,您不能从类外部访问私有(private)声明的成员。

关于c++ - 虚函数破坏私有(private)访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5685514/

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