从派生类构造函数调用基类构造函数
Calling base class constructor from derived class constructor
这是问题代码:
#include<iostream>
using namespace std;
class baseClass
{
public:
int objID;
baseClass()
{
cout << "(1) Default constructor" << objID << endl;
}
baseClass(int ID) // constructor
{
objID = ID;
cout << "(2) Constructing base object with ID: " << objID << endl;
}
};
class derivedClass : public baseClass
{
public:
derivedClass(int ID)
{
baseClass(10); // Line 1
//baseClass(ID); // Line 2
cout << "(4) Constructing derived object with ID: " << objID << endl;
}
};
int main(int argc, char** argv)
{
derivedClass dcObj(1);
return 0;
}
我遇到的问题是派生类构造函数中的第 2 行。它给了我一个错误,我正在重新定义一个形式参数。我知道这是因为编译器认为我正在声明一个名为"ID"的baseClass类型的变量。我知道我应该在初始值设定项列表中调用它。
但我的问题是为什么 1 号线工作?编译器将第 1 行解释为值为 10 的 baseClass 对象的实例化。那为什么 2 行不工作。在这两种情况下,我都传递了一个 int。编译器如何区分这两者。
有一个古老的规则,继承自C,它尽最大努力让程序员发疯:
如果它可以是声明,请将其视为声明。
再加上 C++ 允许您在许多地方插入多余的括号 - int (x);
是一个有效的变量声明 - 这意味着
baseClass(ID);
被视为
baseClass ID;
(现阶段没有检查"ID"是否已经意味着什么,这只是语法。
在稍后阶段,当参数"ID"已知时,这将成为重新定义。
另一方面
baseClass 10;
不可能是一个声明,所以它被认为是意味着
baseClass(10);
构造一个未命名的baseClass
实例并立即将其丢弃。
1 行正在工作,baseClass
因为它有一个默认的构造函数baseClass()
,当您创建 derivedClass
的实例时会自动调用该构造函数。对第 1 行中 baseClass(10)
的调用将创建一个 baseClass
类型的临时对象,该对象永远不会使用。选择此调用是因为10
不是有效的变量名,因此它被解释为函数的参数。
线条的解释
baseClass(ID);
作为声明可以追溯到标准。来自C++标准草案N3337(强调我的):
6.8 歧义解决
1 涉及表达式语句和声明的语法存在歧义:将函数样式显式类型转换 (5.2.3) 作为其最左侧子表达式的表达式语句与第一个声明符以 (.在这些情况下,声明是声明。[ 注意:为了消除歧义,可能必须检查整个语句以确定它是表达式语句还是声明。这消除了许多示例的歧义。
CASE_1 :-
baseClass(ID);
这给了你错误,因为它被编译器解释为
baseClass ID; <<< You're redefining ID.
CASE_2 :-
baseClass(10);
由于baseClass 10
解释是无意义的,编译器将其视为构造函数调用。
编译器无法识别您调用导数,他只是尝试创建参数,对于 ID,他尝试创建一个名为 ID 的变量,而对于 10,他只是创建无名的临时对象。
- 使用基类指针调用基类的值构造函数的语法是什么?
- 在初始化列表之外手动调用基类的构造函数
- 在成员构造函数之后调用基类构造函数
- 如何在具有相同函数名称的派生类中调用基类的函数
- 有没有办法在C++中调用基类的所有子类函数?
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 有没有办法调用基类函数,该函数在使用私有继承的派生类中被覆盖?
- 如何在C++中调用基类虚函数
- 调用基类函数时强制使用类名?
- 当派生类无法轻易将参数传递到基类时,如何调用基类构造函数
- 派生类构造函数调用基构造函数
- 在C++中调用基类模板构造函数
- 转发构造函数调用基类的复制构造函数2次
- 派生类构造函数调用基类构造函数
- 从派生类构造函数调用基类构造函数
- 从派生类构造函数调用基类构造函数
- C++:使用函数调用基类中的派生类
- 为什么隐式复制构造函数调用基类复制构造函数,而定义的复制构造函数不调用?
- 如何从派生类复制构造函数调用基类复制构造函数
- 如何在异常时不从构造函数调用基类析构函数