具有多态性的复制构造函数和赋值操作符



刚刚因为这个面试失败,我仍然很困惑:

class A
{
public:
A(int a) : a_(a) {}

// Copy constructor

// Assignment operator

private:
int a_;
};

class B : public A
{
public:
B(int a, int b) : A(a), b_(b) {
}

// Copy constructor

// Assignment operator

private:
int b_;
};

如何实现复制构造函数/赋值操作,为什么B的构造函数必须在初始化列表中初始化A ?如果不在列表中,它将无法工作。

如何实现copy constr/assign op

我想这是骗人的问题。在这种情况下,最好的选择是什么都不做。两个类都不包含(也不拥有)任何需要超出默认特殊成员函数的资源。遵守零规则。

一些风格指南建议显式默认特殊成员函数。在本例中

class A
{
public:
A(int a) : a_(a) {}

A(const A &) = default;
A& operator=(const A &) = default;

private:
int a_;
};

可能是合适的

为什么B的构造函数必须在初始化列表中初始化A ?

所有类成员和基类必须在进入构造函数体之前完全构造好。

B(int a, int b) 
{ // Entering constructor's body. A must be constructed before we get here.
}

A没有默认构造函数,因此必须在初始化列表中显式调用它所拥有的构造函数来构造基类,然后才能继续构造B

解决评论

A的复制构造函数和赋值操作符是平凡的:

A(const A & src): a_(src.a_)
{
}
A& operator=(const A & src)
{
a_ = src.a_;
return *this;
}

B有点棘手,因为它还必须确保复制A

B(const B & src): A(src), // copy the base class
b_(src.b_)
{
}
B& operator=(const B & src)
{
A::operator=(src); // assign the base class by explicitly calling its 
// assignment operator
b_ = src.b_;
return *this;
}

注意:如果我要招聘的话,我会选择那些在刁难问题上给我打电话的程序员,而不是那些做额外工作并冒着非强制错误风险的程序员。

为什么B的构造函数必须在类中初始化A初始化器列表吗?

A只有一个接受int类型的构造函数。BA作为基类,这意味着每个B对象必须首先构造一个A对象。除了使用初始化器列表,您还将如何构造带有所需参数的A对象?

相关内容

  • 没有找到相关文章

最新更新