q09*_*987 15 c++ inheritance constructor
class A : public B
{
...
}
// case I : explicitly call the base class default constructor
A::A() : B()
{
...
}
// case II : don't call the base class default constructor
A::A() // : B()
{
...
}
Run Code Online (Sandbox Code Playgroud)
案例II是否与案例I相同?
对我来说,我假设在案例II中没有调用base clasa B的默认构造函数.
谢谢
///更新///
class B
{
public:
B()
{
cout << "B constructor" << endl;
}
};
class A : public B
{
public:
A()
{
cout << "A constructor" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
//从VS2008输出
B constructor
A constructor
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)
如果B没有用户声明的构造函数,则行为不同。相比:
struct SimpleAggregate {
int a;
float b;
};
struct ClassWrapper : SimpleAggregate {
ClassWrapper() : SimpleAggregate() { }
};
ClassWrapper w;
Run Code Online (Sandbox Code Playgroud)
现在,w.a并且w.b保证为零。如果您不进行基类的显式初始化,它们将具有不确定的值。
您可能不知道,尽管有语法,上面的 使用SimpleAggregate()并没有调用默认构造函数。它只是对基类进行值初始化(我们在 Stackoverflow 上有几个关于“值初始化”是什么的很好的答案),而不是调用默认构造函数,因为没有用户声明。
为了完成学习体验并加深理解,您可以开始稍微修改一下.例如,B没有默认构造函数时会发生什么?它甚至编译?像这样的其他细微修改将提供良好的学习体验.
也就是说,根据我的经验,这样做通常会更好
A::A() : B() { ... }
Run Code Online (Sandbox Code Playgroud)
比
A::A() { ... }
Run Code Online (Sandbox Code Playgroud)
因为前者更明确,它会让你思考基类初始化的真正含义.您可能会通过明确拼写出来来避免隐藏行为.
| 归档时间: |
|
| 查看次数: |
15113 次 |
| 最近记录: |