#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();
}
Run Code Online (Sandbox Code Playgroud)
我们现在能够调用DI的私有函数想知道这不会破解C++封装吗?
PS:请转到虚拟功能中的虚拟功能访问部分.我不知道为什么我粘贴时没有得到确切的链接.
bptr->f()在运行时评估调用,具体取决于指向的对象类型bptr.在编译时编译看到bptr->f()电话呼叫到B::f(),自B::f()是public编译器不报告唯一的错误.只有在运行时D::f()才会评估实际的函数调用.
这并没有打破这个Encapsulation原则,这是C++的一个特性叫做Run-time Polymorphism或Dynamic Polymorphism
您不能直接调用dptr->f()因为D::f()在PrivateAccess说明符下声明,并且您无法从类外部访问私有声明的成员.
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |