【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++虚函数、虚函数的作用和使用方法

转自:http://c.biancheng.net/cpp/biancheng/view/244.html 我们知道,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是...
  • csCrazybing
  • csCrazybing
  • 2016年09月19日 12:53
  • 670

C++中虚函数的作用是什么?它应该怎么用呢?

虚函数联系到多态,多态联系到继承。所以本文中都是在继承层次上做文章。没了继承,什么都没得谈。下面是对C++的虚函数这玩意儿的理解。一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应...
  • weiyuefei
  • weiyuefei
  • 2016年04月12日 21:25
  • 897

纯C语言简单模拟C++的虚函数表

多态,面向接口编程等设计方法并没有绑定到任何特定的语言上,使用纯C也可以实现简单的多态概念。下面给出一个非常简单粗糙的例子,只为说明概念。 父类Animal定义 文件:animal.h#ifndef...
  • smstong
  • smstong
  • 2016年02月15日 18:14
  • 2453

虚拟函数是否应该被声明仅为private/protected?

问题导入 我想对于大家来说,虚拟函数并不能算是个陌生的概念吧。至于怎么样使用它,大部分人都会告诉我:通过在子类中重写(override)基类中的虚拟函数,就可以达到OO中的一个重要特性——多态(po...
  • jinzhichaoshuiping
  • jinzhichaoshuiping
  • 2016年08月25日 09:06
  • 704

关于C++中虚函数的作用

昨天去面试,面试官问道:虚函数有什么作用,我解释了半天也没解释清楚,其实说到底还是理解不够深刻,或者说简直没什么理解,连子类重写父类的普通函数和子类重写父类的虚函数的区别都不知道,真是弱爆了!!1 ...
  • qq792326645
  • qq792326645
  • 2015年11月21日 15:39
  • 1780

C++的多态与虚函数

多态的作用:继承是子类使用父类的方法,而多态则是父类使用子类的方法。 在C++中,多态有两种,一种是函数重载,一种是虚函数。函数重载发生在编译的时候,它的函数参是不一样的。而虚函数是发生在运行的时候,...
  • chencheng126
  • chencheng126
  • 2015年01月06日 21:49
  • 1690

C/C++ :C++实函数、虚函数、纯虚函数、函数重写

C++实函数、虚函数、纯虚函数、函数重写 和以前一样,先做好准备g
  • Ricardo_He
  • Ricardo_He
  • 2014年11月06日 18:21
  • 1232

c++虚函数实现机制及内存模型

前言 大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函...
  • mightySheldor
  • mightySheldor
  • 2015年11月19日 15:35
  • 1917

【C++拾遗】 C++虚函数实现原理

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50454819我们知道,与C语言相比,C++在布局和存取时间上的额外开销主要是由虚...
  • Xiejingfa
  • Xiejingfa
  • 2016年01月04日 15:47
  • 1427

C++之虚函数(三)虚继承和虚基类详解

多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名...
  • Bruce_0712
  • Bruce_0712
  • 2017年02月18日 10:52
  • 333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C/C++】C++之private虚函数
举报原因:
原因补充:

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