C++中类设计中重要且容易忽视的问题

本文探讨了C++中基类构造函数调用虚函数的行为。解释了为何调用的是基类而非派生类的函数,并通过示例说明了这种设计的重要性。

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赋值,显然是荒谬的。所以这样设计是不合理的。
    希望这些小东西对大家有用。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值