构造多态类
Construction of polymorphic classes
本文关键字:多态 更新时间:2023-10-16
我有一个关于使用继承构造类的方式的问题。在下面的例子中,对Base
构造函数的调用依赖于Derived
类中实现的函数。这个函数再次依赖于Derived
成员generator
,直到Base
构造函数调用之后才初始化。
如果先构造Base
类,变量Base::in_
不会包含垃圾数据吗?
class Derived
: public Base
{
Derived()
: Base(get_data()),
generator(5) {}
Generator generator;
int get_data() { return generator.get_some_data(); }
};
class Base
{
Base(int in)
: in_(in) {}
int in_;
}
首先,代码中没有任何东西是多态的。多态性是关于虚函数的。
接下来,您的类Base
不依赖于任何东西。看看class Base {
和匹配的}
之间,没有任何东西依赖于外部的任何东西。
Derived
中的Base
子对象的构造依赖于派生类的另一个成员,该成员在Base
之后构造。你的分析基本上是正确的,这是一个真正的问题,需要通过重构你的类来解决。
最简单的方法是Base的两阶段初始化(以下是伪代码,可能无法编译):
class Base {
Base(int in = 0) : in_(in) {}
void set(int in) { in_ = in; }
int in_;
};
class Derived : public Base {
Derived() : Base(), generator(5) {
Base::set(generator);
}
...
};
另一个方法是将依赖项移动到另一个基类:
class Base2 { ... generator implemented here ... };
class Derived : public Base2, public Base {
Derived() : Base2(5), Base(Base2::generator) {}
};
参见继承中调用构造函数/析构函数的顺序
在初始化派生类的任何成员之前,将调用Base的构造函数。因此,当调用get_data()时,生成器将不会被初始化。
基本上,Base将使用垃圾初始化
我不知道标准是怎么说的,但这显然是一个问题,当get_data()
被调用时,generator
的值是什么,就像你从其他地方调用它一样,然后构造函数。
从构造函数内部调用的代码与其他代码没有任何不同。
我的猜测是get_data()在生成器构造之前被调用,因此您将在运行时获得NULL异常。
另一点要提到的是,基类当然是首先构造的。它是基类。Derived
是一个Base
,它有一个字段in_
。
根据经验,一个好的模式是:
- 避免从构造函数调用方法。使用一个额外的init方法。
- 无论如何都要小心循环构造函数调用。
你也可以在Base
中使get_data
抽象,然后在Base
的Init()
中调用它,这在我看来是实现对子类依赖的正确方式。
class Derived
: public Base
{
Derived()
: Base(),
generator(5) {}
Generator generator;
virtual int get_data() { return generator.get_some_data(); }
};
class Base
{
Base()
{
}
Init() {
in_ = get_data();}
int in_;
virtual int get_data() = 0;
}
相关文章:
- 多态性和功能结合
- 具有默认模板参数的多态类的模板推导失败
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 多态二进制函数
- 访问存储在向量C++中的结构的多态成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 将 std::allocate_shared 与多态资源分配器一起使用
- 通过switch和static_cast访问多态对象的运行时类型
- C++boost序列化多态性问题
- 多态杆件变量 - 类设计
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- Doees the 'this' 指针参与虚函数的多态行为
- C++ 在堆栈中包含多态属性的类对象存储
- 基类和派生类的多态赋值运算符
- 转身多态对象
- 如何在基类指针向量的元素上应用重载的多态函数
- 具有智能指针的多态性
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- C++事件系统 - 多态事件和事件处理程序