【C/C++】C++之private虚函数

转载 2013年12月03日 00:31:36

原文地址:C++之private虚函数


一般我们说虚函数,它的访问级别都是public的,用类对象可以直接调用,这样就可以实现运行时的类型绑定,那如果我们将虚函数私有化会出现什么情况呢?

我们先来看一个非虚函数私有化的例子

复制代码
class Base
{
private:
    void PrintClassName ()
    {
        cout<<"Base"<<endl;
    }
public:
    void print()
    {
        PrintClassName();
    }
};

class Derived : public Base
{
private:
    void PrintClassName()
    {
        cout<<"Derived"<<endl;
    }
};
复制代码

在main函数里产生一个Derived的对象d,然后调用print()函数,即d.print(),结果输出的却是Base,print()函数没有调用子类的PrintClassName函数,而是调用父类的PrintClassName函数,原来是由于PrintClassName函数不是虚函数之故,所以Base的print()函数调用PrintClassName()函数是在编译时就已经绑定了,而不是运行期绑定。

下面我们让PrintClassName()函数变成虚函数再执行,就可以看到输出的类名为子类的名称,即Derived。

那么我们有没有办法调用私有的虚函数呢?当然是有的,不管公有还是私有,只要是虚函数,它的函数地址都会放在虚函数表vftable中,只要我们找到虚函数表中存放的PrintClassName()函数的地址,我们就可以直接调用,前提是你必须对C++类对象的内存布局要熟悉,代码如下,这样也输出Derived,与前面效果相同

复制代码
int _tmain(int argc, _TCHAR* argv[])
{
    
    Derived d;
    //d.print();
    typedef void (*Fun)();
    Fun pFun = NULL;
    pFun = (Fun)*((int *)(*(int *)&d + 0) + 0);
    pFun();

    getchar();
    return 0;
}
复制代码

相关文章推荐

C/C++日常学习总结(第六篇)多基派生引起的虚函数访问二义性问题&重载,覆盖,隐藏的区别

1.构造函数和析构函数的调用顺序? 析构函数为什么要虚拟?

C/C++ 初学简单笔记 —4— 多态性 虚函数和抽象类

1. 多态性 1). 函数重载和运算符重载这两种多态性,在编译时就能确定的,叫做静态连编 2). 像虚函数,根据运行时的对象不同,而显示不同的效果,叫做动态连编 2. 虚函数,若基类中有虚函数,则...

C/C++——多态性和虚函数

多态性是面向对象程序设计的重要特征,本文主要对多态性进行了总结介绍,包括C++多态性的一些基本知识、虚函数和纯虚函数等,以便于读者在程序设计中更好地利用多态性进行面向对象的程序设计。

【重温C/C++】explicit+||template||virtual虚函数||重载和重写

explicit   只对构造函数起作用,用来抑制隐式转换。如:      class   A   {              A(int   a); &...

C/C++多态性(polymorphism)虚函数

从系统实现的角度,多态性分为两类:静态多态性和动态多态性。函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此有称为编译时的多态。静态多态性是通过函数的重载实...

C/C++日常学习总结(第五篇)多态和虚函数的访问

1.多态性 多态性分为静态多态性和动态多态性

C/C++—— 在构造函数中调用虚函数能实现多态吗(Vptr指针初始化的过程分析)

问题引入:比如:如果我们想在父类的构造函数中调用虚函数,当定义子类对象的时候,父类的构造函数中的虚函数执行的是子类中的函数。

C/C++基类的析构函数为什么要为虚函数

为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。 (1)第一种情况:没有多态,创建派生类对象,基类的析构函数不是虚函数 #inc...

C++虚函数实现原理

  • 2015-10-24 21:11
  • 471KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)