哪些函数不能为virtual函数】的更多相关文章

http://blog.csdn.net/freeboy1015/article/details/7635012 为什么内联函数,构造函数,静态成员函数不能为virtual函数? 1> 内联函数 内联函数是在编译时期展开,而虚函数的特性是运行时才动态联编,所以两者矛盾,不能定义内联函数为虚函数. 2> 构造函数 构造函数用来创建一个新的对象,而虚函数的运行是建立在对象的基础上,在构造函数执行时,对象尚未形成,所以不能将构造函数定义为虚函数. 3> 静态成员函数 静态成员函数属于一个类而非…
1> 内联函数 内联函数是在编译时期展开,而虚函数的特性是运行时才动态联编,所以两者矛盾,不能定义内联函数为虚函数. 2> 构造函数 构造函数用来创建一个新的对象,而虚函数的运行是建立在对象的基础上,在构造函数执行时,对象尚未形成,所以不能将构造函数定义为虚函数. 简单来说就是:虚函数对应一个指向vtable虚函数表的指针,虚函数的执行依赖于虚函数表.而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表.而在构造对象期间,虚函数表还没有被初始化,将无法进行. 3>…
在base class构造期间,virtual函数不是virtual函数. 构造函数.析构函数中不要调用virtual函数.…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为方便采用书上的例子,先提出问题,在说解决方案. 1 问题 1: class Transaction{ 2: public: 3: Transaction(); 4: virtual void LogTransaction() const = 0 ; 5: ... 6: }; 7:  8: Transaction::Transaction() //Base cl…
举书上的例子,考虑一个virtual函数的应用实例: class GameCharacter { private: int BaseHealth; public: virtual int GetHealthValue() const // 返回游戏人物的血量 { return BaseHealth; } int GetBaseHealth() const { return BaseHealth; } }; class KnightBoss : public GameCharacter { pub…
有一部分人总是主张virtual函数几乎总应该是private:例如下面这个例子,例子时候游戏,游戏里面的任务都拥有健康值这一属性: class GameCharacter{ public: int healthValue()const{ ... int retVal = doHealthValue(); ... return retVal; } private: virtual int doHealthValue() const { }//上面的这个non-virtual函数实际上是virtu…
本文是我在学习c++过程中的一些思考和总结,主要是c++中关于函数的林林总总.欢迎大家批评和指正,共同学习. os version: ubuntu 12.04 LTS gcc version: gcc 文中以 $ 开头语句表示 shell command 0.this 指针 我觉得首先得讲明白这个东东,让大家明白c++中函数与c语言中函数的区别什么是 this 指针? 这里我直接选自 ISO c++ 中关于 this 定义(注:我会大量援引ISO c++,相信大家应该都看得懂,哈哈) In th…
在C++中,有四种选择可以替代virtual函数的功能: 1.non-virtual interface(NVI)手法,这是一种template method模式.它以public non-virtual成员函数包含较低访问性的virtual函数.对于子类而言,子类只需重定义私有的virtual函数即可. 2.将virtual函数替换为"函数指针成员变量",这是Strategy模式的一种表现形式.这种方案的优点在于,将类和行为分离(比如相同的类的不同对象可以具有不同的行为):缺点在于,…
virtual函数的替代方案包括NVI手法及Strategy设计模式的多种手法.NVI手法自身是一个特殊形式的Template Method设计模式. 将机能从成员函数移到class外部函数,带来的一个缺点是,非成员函数无法访问class的non-public成员. tr1::function对象的行为就想一般函数指针.这样的对象可接纳“与给定之目标签名式(target signature)兼容”的所有可调用物(callable entities).…
在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层).…