C++中类设计中重要且容易忽视的问题
大家考虑一下如下程序的输出结果
#include <stdio.h>
class baseclass
{
public:
baseclass()
{
fun();//这里是调用基类的fun还是派生类的fun?
}
virtual void fun()
{
printf("调用基类函数fun/n");
}
void test()
{
fun();//这里是调用基类的fun还是派生类的fun?
}
};
class deriveclass:public baseclass
{
public:
virtual void fun()
{
printf("调用派生类函数fun/n");
}
};
int main()
{
deriveclass d;
d.test();
return 0;
}
可能很多人会得出如下的结果
结果1:
调用派生类函数fun
调用派生类函数fun
结果2:
调用基类函数fun
调用基类函数fun
很遗憾两种结果都错了!
正确的结果应该是:
调用基类函数fun
调用派生类函数fun
为什么是这样的结果,基类的构造函数如果调用虚函数的话只调用基类的函数,不可能调用派生类的函数。
为什么这样做呢?且看改动后的情况。
#include <stdio.h>
class baseclass
{
public:
baseclass()
{
fun();//这里是调用基类的fun还是派生类的fun?
}
virtual void fun()
{
printf("调用基类函数fun/n");
}
void test()
{
fun();//这里是调用基类的fun还是派生类的fun?
}
};
class deriveclass:public baseclass
{
int n;
public:
virtual void fun()
{
n=0;
printf("调用派生类函数fun/n");
}
};
int main()
{
deriveclass d;
d.test();
return 0;
}
如果基类的构造函数调用的是派生类函数fun,这下可坏了,由于基类的先于派生类构造,派生类的n还没有,而基类要给i赋值,显然是荒谬的。所以这样设计是不合理的。
希望这些小东西对大家有用。
本文探讨了C++中基类构造函数调用虚函数的行为。解释了为何调用的是基类而非派生类的函数,并通过示例说明了这种设计的重要性。
215

被折叠的 条评论
为什么被折叠?



