我不知道这个问题对你有多奇怪:为什么这段代码打印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
一样有效。所以我开始写一个我的代码的简短版本,在这里发布操作系统并寻求帮助,但现在我发现了这个问题。我错过了什么?
答案 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。