我最近看到这篇文章IBM site http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr134.htm。下面是示例代码
#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 的私有函数。我想知道这是否会破坏 C++ 封装?
附: :请参阅虚拟函数中的虚拟函数访问部分。我不知道为什么粘贴时没有得到确切的链接。
电话bptr->f()
在运行时根据所指向的对象类型进行评估bptr
。在编译时,编译会看到bptr->f()
呼叫作为呼叫B::f()
自从B::f()
is public
编译器不仅仅报告错误。只有在运行时才真正调用函数D::f()
被评估。
这并没有打破Encapsulation
原则上这是 C++ 的一个特性,称为Run-time Polymorphism
or Dynamic Polymorphism
您不能直接调用dptr->f()
因为D::f()
被宣布为Private
访问说明符并且您不能从类外部访问私有声明的成员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)