学编程 ❀(๑╯◡╰๑)❀ 就上soxunxi.cn!这里有CMS,CSS,NET,PHP,Linux,HTML,JAVA,MySQL,Python等教程.
当前位置: NET > 详解C++虚成员函数和动态联编_C#.Net教程,C++

C++在构造函数中使用new时,需要注意这些事!_C#.Net教程

1、如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete;2、​new和delete必须相互兼容。new对应于delete,new[]对应于delete[];3、如果有多个构造函数,则必须以相同的方式使用new...

推荐学习: 《c++教程》

——编译器对非虚方法使用静态联编(编译时匹配),对虚方法使用动态联编(运行时匹配)。

  • 未使用虚方法时,指针类型在编译时已知,因此编译器在编译时,可以将成员方法关联到相应的类,这被称为静态联编;
  • 使用虚方法时,通常只有在运行程序时才能确定对象类型,所以编译器生成的代码在程序执行时将成员函数关联到相应的类,这被称为动态联编。

  静态联编比动态联编效率高。

  虚函数的工作原理。

  虚函数。

  重新定义成员函数(改变函数特征标)。

  重新定义重载的成员函数。

效率

为使程序能够在运行阶段进行决策,必须采取一些方法来跟踪基类指针或引用指向的对象类型,这增加了额外的处理开销。因此下列情况更适合静态联编:

  • 类不会用作基类
  • 派生类不重新定义基类的任何方法

因此静态联编被设置为C++的默认选择。

如果要在派生类中重新定义基类的方法,则将它设置为虚方法;否则设置为非虚方法。

虚函数的工作原理

编译器处理虚函数的方法是:给每个对象添加一个隐藏成员。隐藏成员中保存了一个指向·函数地址·数组的指针。这种数组被称为虚函数表(vtbl),表中存储了为类对象进行声明的虚函数的地址。

C++如何简单输出当前日期时间_C#.Net教程

首先介绍2个数据类型。一个是time_t,与时间函数相关的变量,定义的变量记录着自 1970 年 1 月 1 日以来经过的秒数,也称作时间戳。另一个是结构体tm...

派生类对象将包含一个指向独立地址表的指针(即新创建一个表)。(增加内存开销)

调用虚函数时,程序将查看存储在对象中的vtbl地址,然后转向相应的函数地址表并在表中查找地址。(影响执行速度)

总之,使用虚函数将在内存和执行速度上有一定的成本;即使非函数的效率比虚函数稍高,却不具备动态联编功能。

构造函数不能是虚函数。

析构函数应当是虚函数,除非类不用做基类。

友元函数不能是虚函数,因为友元不是类成员,而只有成员才可以是虚函数。

如果派生类没有重新定义函数,将使用该函数的基类版本(继承它)。如果派生类位于派生链中,则将使用最新的虚函数版本(指针或引用调用),基类版本被隐藏的情况除外。

重新定义将隐藏基类方法:

class Dwelling
{public:    virtual void showperks(int a) const;
    ...
};class Hovel : public Dwelling
{public:    virtual void showperks() const;
    ...
}

在派生类中重新定义函数(改变了参数特征标),将隐藏同名的基类方法,而不是重载基类方法。

Hovel trump;
trump.showperks();    // validtrump.showperks(5);    // invalid

如果重新定义继承的方法,应确保与原来的原型完全相同。如果返回类型为基类引用或指针,则可以修改为指向派生类的引用或指针(返回类型协变:即允许返回类型随类类型的变化而变化)。

如果基类声明被重载了,则应在派生类中重新定义所有的基类版本;如果只定义了一个版本,则其它版本将被隐藏,派生类对象将无法使用它们。

class Dwelling
{public:    virtual void showperks(int a) const;    virtual void showperks(double x) const;    virtual void showperks() const;
    ...
};class Hovel : public Dwelling
{    virtual void showperks(int a) const;    virtual void showperks(double x) const;    virtual void showperks() const;
    ...
};

如果不需要修改,则新定义可只调用基类版本:

void Hovel::showperks()const {Dwelling::showperks();}

以上就是详解C++虚成员函数和动态联编的详细内容,更多请关注ki4网其它相关文章!

详解C++ 多态公有继承_C#.Net教程

方法的行为应取决于调用该方法的对象。这种较复杂的行为称为多态——具有多种形态,即同一个方法的行为随上下文而异。virtual实现了对象调用正确的方法或方法序列,实现多态的两种机制...

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

分享到:
赞(0) 打赏

支付宝扫一扫打赏

微信扫一扫打赏

标签:

上一篇:

下一篇:

相关推荐

0 条评论关于"详解C++虚成员函数和动态联编_C#.Net教程,C++"

最新评论

    暂无留言哦~~

博客简介

看古风美女插画Cos小姐姐,素材合集图集打包下载:炫龙网,好看二次元插画应有尽有,唯美小姐姐等你来。

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

服务热线:
 

 QQ在线交流

 旺旺在线