为什么这段代码打印6而不是5?

时间:2014-03-07 18:45:37

标签: c++ clang add

我不知道这个问题对你有多奇怪:为什么这段代码打印6而不是5?据我所知,应该在这里使用通常的算术,因为一旦我没有重载+运算符和2+3 = 3+2 = 5(据我所知)

#include <stdio.h>
#include <stdlib.h>

enum A
{
    A_A,
    A_B
};

struct Foo
{
    Foo(int, int, enum A);
    int x;
    int y;
    enum A flags;
};

struct Baa : Foo
{
    Baa(int, int);
    void show();
};


Foo::Foo(int a, int b, enum A aflags)
{
    x = a;
    y = b;
    flags = aflags;
}

Baa::Baa(int c, int d)
    : Foo(c, d, A_B)
{
}

void Baa::show()
{
    if(flags == A_A)
        printf("a = [%d]\n", x + y);
    else if(flags == A_B)
        printf("b = [%d]\n", y + y);
    else
        puts("unknow flag");
}

int main()
{
    Baa *b = new Baa(2, 3);
    b->show();
}

输出:

b = [6]

我在访问派生类的成员值时遇到了另一个问题 - 如果你想知道,我得到0而不是实际值,所以要获得我需要将其转换为派生类型的实际值class,就像这个int x = ((BaseCLass*)this)->n一样有效。所以我开始写一个我的代码的简短版本,在这里发布操作系统并寻求帮助,但现在我发现了这个问题。我错过了什么?

3 个答案:

答案 0 :(得分:4)

printf("b = [%d]\n", y + y);

您的意思是x+y代替y+y吗?所以,3 + 3是6是正确的。

答案 1 :(得分:3)

您正在创建Baa对象:

Baa *b = new Baa(2, 3);

接下来会发生什么:

Baa::Baa(int c, int d)
    : Foo(c, d, A_B)  // < flag A_B !
{
}

它的作用是:

Foo::Foo(int a, int b, enum A aflags)
{
    x = a;
    y = b;
    flags = aflags;
}

然后在show方法中执行:

else if(flags == A_B)
        printf("b = [%d]\n", y + y);

y + y = 3 + 3 = 6.混淆在哪里?


旁注:delete b;在哪里?

答案 2 :(得分:1)

在我看来,关键是:

else if(flags == A_B)
    printf("b = [%d]\n", y + y);

Baa构造函数将flags设置为A_B。因此show()将输出y + y,即3 + 3 = 6。