积累系统性知识
积聚技术精华
  首页    个人中心    撰写积文    建立课题    订立目标    整理积文    管理课题    管理目标    技能Get    代码积累 
C++中类设计中重要且容易忽视的问题
error997 (error997)    2014-11-20 20:21:07      目标    课题
   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赋值,显然是荒谬的。所以这样设计是不合理的。
    希望这些小东西对大家有用。

转自 http://blog.csdn.net/y___y/article/details/1620969
(+0)技能Get

建议楼主:搜索关键字 |参考其他资源 |回复 |追问
  error997(error997):   个人中心    课题    目标    代码积累