C++ primer 这本书上有这么两句话“派生类虚函数调用基类版本时,必须显式使用作用域操作符。如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将是一个自身调用,从而导致无穷递归。”
2011-11-08 20:42
471 查看
(整理)
当你实现派生类虚函数时,如果函数体内需要调用基类的虚函数版本时,需要显式使用基类的作用域操作符,否则就会在派生类作用域内调用派生类版本的虚函数,这样会导致无穷递归。
就是自己在调用自己呀,没有指明调用的是基类的虚函数,自动认为是调用派生类的虚函数,然后就再次调用了,一直进行下去了
struct A
{
virtual void foo(void) { }
}
struct B: public A
{
void foo(void)
{
foo(); // 递归调用自己,即 B::foo()
A::foo(); // 明确告诉编译器,调用的是 A::foo(), 而不是自己
}
}
当你实现派生类虚函数时,如果函数体内需要调用基类的虚函数版本时,需要显式使用基类的作用域操作符,否则就会在派生类作用域内调用派生类版本的虚函数,这样会导致无穷递归。
就是自己在调用自己呀,没有指明调用的是基类的虚函数,自动认为是调用派生类的虚函数,然后就再次调用了,一直进行下去了
struct A
{
virtual void foo(void) { }
}
struct B: public A
{
void foo(void)
{
foo(); // 递归调用自己,即 B::foo()
A::foo(); // 明确告诉编译器,调用的是 A::foo(), 而不是自己
}
}
相关文章推荐
- 定义一个哺乳动物Mammal类,再由此派生出狗Dog类,二者都定义 Speak()成员函数,基类中定义为虚函数,定义一个Dog类的对象,调用Speak函数,观察运行结果
- C++模板类的派生类中访问基类成员必须显式调用(作用域限定)
- 【郝斌数据结构自学笔记】53-56_一个函数为什么可以自己调用自己_递归必须满足三个条件_循环和递归的比较
- 虚函数调用时一点注意,调用基类函数时调用派生类函数
- 派生类虚函数调用基类版本
- 使用派生类对象通过成员函数指针调用基类虚函数之不可能性的证明
- 派生类虚函数调用基类版本
- Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)
- 练习 4-12 运用 printd 函数的设计思想编写一个递归版本的 itoa 函数,即通过递归 调用把整数转换为字符串
- 《Java程序》使用递归调用的方法,写一个能够将字符串倒叙输出的函数
- 编写一个函数func(),将此函数的输入参数(int型)逆序输出显示,如54321 –> 12345,要求使用递归,并且函数体代码不超过8行
- 多态继承情况下,有一个基类指针指向派生类对象,如何用它调用基类的虚函数?
- 转载:VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- 使用OLE对象遇到莫名其妙的情况时,有可能是没调用初始化函数导致的。
- 使用extjs,来实现一个页面调用另一个页面中的方法,并且能获得方法的返回值
- VS中c++文件调用c 函数 ,fatal error C1853 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
- 2.编写一个函数实现n^k,使用递归实现
- 编写一个函数实现n^k,使用递归实现
- 编写查找一个单链表特定元素的程序。分别使用递归和非递归方法实现,并比较它们的运行时间。
- 条款27: 如果不想使用隐式生成的函数就要显式地禁止它