这个简单的例子演示了调用基类构造函数的C ++语法 - 据我所知,它是一个C ++学习者:
class BaseClass {
protected:
int i;
public:
BaseClass(int x) {
i = x;
}
};
class DerivedClass: public BaseClass {
int j;
public:
DerivedClass(int x, int y): BaseClass(y) {
j = x;
}
这里,基类构造函数可以将派生类构造函数的命名参数作为输入。
现在,如果我想使用不是BaseClass()
的直接输入的输入值调用DerivedClass()
构造函数,该怎么办?基本上,我想在x
内使用y
和DerivedClass()
进行多线工作,然后将计算值传递给BaseClass()
。这可以用构造函数完成吗?这应该用某种初始化方法来完成吗?
答案 0 :(得分:11)
你可以这样做,是的:
class BaseClass
{
public:
BaseClass(int x) : i(x) {}
private:
int i;
};
class DerivedClass: public BaseClass
{
public:
DerivedClass(int x, int y):
BaseClass(compute(x, y)), // Neither i or j are initialized here yet
j(x)
{}
private:
static int compute(int a, int b) { return a + b; } // Or whatever
int j;
};
请注意,您甚至可以将compute()
设为非静态方法,但要注意当时DerivedClass
或BaseClass
成员 不会被初始化电话。所以你将无法依赖他们的价值观。
答案 1 :(得分:3)
如果您使用的是C ++ 11或更高版本,您还可以使用lambda表达式:
class BaseClass
{
public:
BaseClass(int x) : i(x) {}
private:
int i;
};
class DerivedClass: public BaseClass
{
public:
DerivedClass(int x, int y): BaseClass(
[=]()->int
{
int sum = 0;
for(int i = 0; i < x; ++i)
{
sum += y + i * x;
}
return sum;
}()), j(x)
{}
private:
int j;
};
答案 2 :(得分:2)
然后你可以这样做:
DerivedClass(int x, int y): BaseClass(compute(x,y)), j(y) {
//j = x; //use member-initialization-list ---> ^^^^
}
int compute(int x, int y)
{
//your code
}