C ++成员初始化VS继承的构造函数初始化

时间:2019-02-05 18:18:20

标签: c++ inheritance

我知道初始化类成员的一种方法是编写以下代码:

class base {
 int id;
 public:
 base(int id): id(id){}
};

但是如果我将此语法与constructor initialization of a derived class混合使用,会怎样:

class base {
 int id;
 public:
 base(int id): id(id){}
};

class dri : public base {
 int base;
 public:
 dri(int id): base(id){}
};

在上面的示例中,在derived类下,base(id){}是指int base还是class base?我假设它是指int base,因为它没有编译。如何使它引用class base

编辑:

第二个问题,假设您看一个随机的C ++代码,如下所示:

class base {
 int id;
 public:
 base(int id): id(id){}
};

如何判断id(id){}是在初始化局部变量还是在初始化另一个类的构造函数?

1 个答案:

答案 0 :(得分:1)

不要重复使用标识符base是最简单的建议。

更复杂的是使用范围解析:

dri(int id): ::base(id){}
              ^
              use base from the global namespace

发布问题编辑答案:

最近定义的标识符用法将用于外部作用域中的定义,除非明确指定了外部作用域。如果没有像编译器那样的作用,并且没有建立自己定义定义的标识符的图形以及在何处执行解析的图表,没有什么好方法可以告诉您。

您遇到的挑战与

完全相同
int string; 
string test; 

在编译器到达string test时,程序员已将string的含义从类型更改为类型int的变量。除了不做之外,没有其他解决办法。

这使我们回到了起点:不要在没有充分理由的情况下在包含的范围内重用标识符。有人会把它搞砸的。