这在C ++ 11中似乎不起作用:
class B : public A
{
public:
B(const A& a)
: A(a) // parent constructor for passing the parameter
, B() // delegating constructor for init of other members
{};
// ...
};
gcc告诉我an initializer for a delegating constructor must appear alone
。
如何用参数调用父类的构造函数,并调用B类的基本构造函数? (我在B中有一堆其他构造函数需要相同的行为)。
现在我正在考虑编写一个私有的B::init()
函数,并在所有构造函数体中使用它,但这很有点像C ++ 03。
首选解决方案是什么?
答案 0 :(得分:5)
我认为首选的委派方式是另一种方式,它不是用来重构构造函数的公共部分,而是将更简单的方法定义为更复杂的案例的特例
因此,您应该从Private sub CommandButton1_Click()
shSource=WorkSheets("Sheet1")
shDest=WorkSheets("Sheet2")
LastRow = shSource.Range("A" & Rows.Count).End(xlUp).Row
For i = 1 To LastRow
Range("A1").Offset(4, 0).Select
Selection.Copy
shDest.Select
shDest.Range("A1").Select
If shDest.Range("A1").Offset(1, 0) <> "" Then
shDest.Range("A1").End(xlDown).Select
End If
ActiveCell.Offset(1, 0).Select
ActiveCell.Paste
Next i
End Sub
开始,并将其用作委派目标。
B(const A& a)
创建class B : public A
{
public:
B() : B(A());
B(const A& a) : A(a) // parent constructor for passing the parameter
{};
};
时,您正在呼叫A()
。
背后的理由是,当你有两个&#34;部分专业化的&#34; c,你将无法使用它们来初始化复杂的那个。 E.g:
B
我相信技术原因在Bathsheba的答案中有所解释。看看如果你在class B : public A
{
public:
B() {};
B(int) : B() {};
B(double) : B() {};
B(double,int) : B(int), B(double) {}; // can't do it.
};
中有一个共同的部分会发生什么:
B()
继承中已知的钻石问题。解决方案是扭转逻辑。
class B : public A
{
public:
B() {};
B(int) : B() {};
B(double) : B() {};
B(double,int) : B(int), B(double) {}; //ooops would get B() called twice!
};
答案 1 :(得分:2)
B(const A& a) : A(a), B()
没有意义,因为B()
也初始化基类A
。这基本上是一个重复的初始化,这是一个固有的矛盾。
该语言唯一真正的选择是,如果使用委托构造函数,则禁止其他任何操作。那是你的编译器告诉你的。