我是 C++
的新手,但我有 Java
背景,所以我了解大部分 OOP
概念。我正在阅读介绍性指南,我遇到了这个例子:
[Foo.H]
class A
{
public:
A(int something);
};
class B : public A
{
public:
B(int something);
};
[Foo.C]
#include "Foo.H"
A::A(int something)
{
printf("Something = %d\n", something);
}
B::B(int something) : A(something)
{
}
假设通过将 A(something)
传递给 B::B(int something)
的初始化列表是否正确,它类似于 java 中的 super
关键字——又名,它将执行 A::A(int something)
的代码?另外,为什么我只调用初始化器列表中的 A(something)
而不是 A::A(something)
?
基本上我问的是:上面是否等同于此:
B::B(int something)
{
A::A(something)
}
让我解释一下为什么我感到困惑。
如果我要使用:
B::B(int something) : A(something)
{
int x = 5;
printf("x = %d", x);
}
并通过
调用代码B::B(7);
这会先打印出 x = 5
还是 something = 7
?为什么会按这个顺序执行?
我只是对语法感到有点困惑,这使得即使在这个简单的例子中也很难理解和形象化发生的继承。
最佳答案
是的,A(something)
传递那个值很像 super
。您不必使用 A::A
,因为该语言会自动将基类名称注入(inject)子类。
但是它不等同于
B::B(int something)
{
A::A(something)
}
因为那不是合法的代码。您只能在初始化列表中选择调用哪个父构造函数。
至于你关于打印的问题......你试过了吗?您会看到父 something=
首先打印,然后是 x=
。
关于C++ 继承初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17839968/