C++笔试题目总结

1多态

class Base2
{
public:
    virtual void init()
    {
        cout << "Base2::init" << endl;
    }
    Base2()
    {
        init();
    }
};

class Drived :public Base2
{
public:
    void init()
    {
        cout << "Drived::init" << endl;
    }
    Drived()
    {
        init();
    }
};

int main()
{
    Base2 *b = new Drived();
    Drived d;
    ((Base2 *)(&d))->init();
    ((Base2)d).init();

    system("pause");
    return 0;
}

输出结果如下:
这里写图片描述
首先,Drived对象构造期间调用Base2的构造函数,此时virtual函数只能调用的是Base2的函数。
((Base2 *)(&d))->init();相当于用Base2指针指向d对象,能够起到多态的效果。
但是((Base2)d).init();起不到多态的效果。

2位域

struct testx
{
    char a : 2;
    char b : 2;
    char c : 1;//以上3个只要没有超过8位就之占1个字节
    int d : 30;
    int e : 3;//这两个超过了32位,占8个字节
};

int main()
{
    testx t;
    cout << sizeof(t) << endl; //输出为9
    system("pause");
    return 0;
}
typedef struct
{
    int a : 2;
    int b : 2;
    int c : 1;
}test;

main()
{
    test t;
    t.a = 1;
    t.b = 3;
    t.c = 1;
    cout << t.a << endl;
    cout << t.b << endl;
    cout << t.c << endl;
}

输出结果是1,-1,-1
解析如下:
因为int是有符号整型,所以它有符号位的,也就是说a和b,实际只能存一个二进制位,另外一个是它的符号位。而c呢,只能表示正负,1就是负,0就是正。

t.a=1相当于使第1位和第0位分别为01
t.b=3相当于使第3位和第2位分别为11
t.c=1相当于使第4位为1

输出结果
t.a,第1位是0所以正数,输出1
t.b,第3位是1所以负数,输出-1
t.c,第4位为1,这就要看编译器怎么处理了,如果把它当成符号位,那就输出-1,如果认为没有符号位,那就输出1

如果想达到输出原数的目的,类型不应使用int而应使用unsigned int,即无符号整型。

3用模板实现是否一个类继承于另一个类

template<typename T, typename TBase> 
class TIsDerived
{
public:
    static int t(TBase* base)
    {
        return 1;
    }
    static char t(void* t2)
    {
        return 0;
    }

    enum
    {
        Result = (sizeof(int) == sizeof(t((T*)NULL))),
    };
};

调用:

cout << TIsDerived<Derived2, Base2>::Result;
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值