C++ 继承初始化列表

标签 c++ inheritance

我是 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/

相关文章:

Javascript 原型(prototype)继承

c# - C# 是否为未使用的模板参数生成具体实现?

C++ 在成员初始化列表中传递 *this

c++ - 在任何以 8 开头的数字之前选择 "a"或 "an"

c++ - 对象创建中涉及的构造函数和析构函数调用

C++ 和抽象类中的继承

python - 使用附加属性扩展类时出现类型错误

c++ - QString拆分返回空字符串列表

c++ - 从 Sublime Text 2 构建后以 cmd 模式运行程序

c++ - 类 Square 应该从类 Rectangle 公开继承吗?