作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我最近在 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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!