是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
Is it possible to defer member variable initialization to inherited class without modifying the parent class?
我遇到了一个特定的问题,我已将其转换为以下最小,完整和可验证的示例。
#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
类具有窗体的构造函数
Parent(int val) : member(val) {}
然后我可以编写一个Child
构造函数作为
Child() Parent::Parent(1) {}
但对我来说并非如此。
问题:是否可以将父级成员变量的初始化推迟到继承的类?如果是这样,如何?
是否可以将父级成员变量的初始化推迟到继承的类?如果是这样,如何?
父类的成员变量在其成员初始化列表或构造函数的主体中初始化。子类不能在其初始值设定项列表中初始化父类的成员变量 - 这是语言不允许的。您能做的最好的事情似乎是在子类的构造函数的主体中设置父类成员的值。
例:
struct foo
{
int a;
};
struct bar : foo
{
bar() : a(0) {} // Not allowed
};
但
struct bar : foo
{
bar() { a = 0; } // Allowed
};
最简单的方法是在Child
类构造函数体中初始化Parent::member
(再次(:
class Child : public Parent
{
public:
Child() {
Parent::member = 1;
}
};
观看现场演示。
正如评论中澄清的那样,您不应该分配Parent::member
变量。
在这种情况下(让我们假设设计至少是有用的(, 您通常能够为父类成员实例的某些属性应用 setter:
class Foo {
Foo(const& Foo) = delete;
Foo& operator=(const& Foo) = delete;
public:
Foo() = default;
int property() const;
void property(int newVal);
};
class Parent {
protected:
Foo member;
public:
Parent() = default;
};
class Child : public Parent {
public:
Child() {
Parent::member.property(1);
};
};
相关文章:
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 在 C++ 中访问 lambda 捕获初始化变量
- 为什么C++不支持对未初始化变量进行智能分析?
- 使用 clang++ 和 g++ 在C++中初始化变量
- C++使用 lambda 初始化变量
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++ - 输出与初始化变量不同?
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- C++ 中的初始化变量
- C++中未初始化变量的值
- 如何在需要提及需要循环声明的其他类的类中初始化变量?
- 我想知道在构造函数中初始化变量时的生命周期
- 读取恰好具有良好值的未初始化变量
- 如何在 getter 的父类中初始化变量的情况下访问子类中的变量
- 为什么在 c++ 中有多种初始化变量的方法
- 没有参数的默认构造函数是否总是初始化变量?
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 使用构造函数跳闸UB的新放置后使用初始化变量