【发布时间】:2017-08-09 19:06:47
【问题描述】:
我遇到了一个特定问题,我已将其转换为以下Minimal, Complete, and Verifiable example。
#include <iostream>
class Foo {
public:
Foo(int v) : val(v) {}
int get_val() const
{
return val;
}
private:
int val;
};
class Parent {
public:
Parent() : member(0) {}
const Foo& get_member() const
{
return member;
}
protected:
Foo member;
};
// Nothing above this line should be changed
class Child : public Parent
{
public:
// This doesn't work (compile error)
//Child() Parent::member(1) {}
// Nor does this (also a compile error)
//Child() this->member(1) {}
};
int main()
{
Child x;
std::cout << x.get_member().get_val() << std::endl;
return 0;
}
此示例演示了我在一个较大的软件项目中遇到的问题,我从外部库继承但需要直接初始化父级的成员变量之一。
不幸的是,父类没有参数化其成员初始化的构造函数。
如果Parent 类有一个表单的构造函数
Parent(int val) : member(val) {}
然后我可以写一个Child 构造函数为
Child() Parent::Parent(1) {}
但对我来说不是这样。
问题:是否可以将父级成员变量的初始化推迟到继承的类?如果有,怎么做?
【问题讨论】:
-
没有。基类必须在派生类开始构建之前完全构建。不能只在派生类构造函数体中设置成员吗?
-
@NathanOliver 谢谢,不,我不能。父类使用设置一些网络连接的默认参数化初始化其成员。这些参数在初始化后无法更改。
-
如果没有办法设置基类成员,你希望如何设置它?
-
@NathanOliver 我什么都不期待。我在问子类是否有办法覆盖父类的默认初始化。
-
啊,很遗憾,没有。您不必为基类创建新的构造函数。
标签: c++ class inheritance initialization