gpt4 book ai didi

c++ - 初始化基类成员的首选方法 (c++)

转载 作者:太空狗 更新时间:2023-10-29 20:34:10 26 4
gpt4 key购买 nike

我有一个基类:

class Base {
protected:
int m_a;
virtual void foo() = 0;
}

和派生类

class Derived : public Base {
public:
Derived(int a);
}

基类是抽象的,所以只能创建派生类。如何更好地实现派生的Ctor?

Derived::Derived(int a) : Base(a) {}
Base::Base(int a) : m_a(a) {}

或者

Derived::Derived(int a) { m_a = a;}
Base::Base(){}

是从 Base 构造函数中删除成员更好,因为它不能单独创建,还是将它保留在 Base 构造函数中以保留对他的赋值?

最佳答案

您的第一个解决方案 - 为基类提供显式构造函数 - 作为一般模式更可取:

  • 避免其他继承自Base的类忘记初始化m_a。相反,类的签名指示需要初始化。

  • 如果多个类继承自 base,并且初始化更复杂(例如范围检查),则此代码和策略不会分布在多个派生类上

  • 如果m_a不可变,则需要构造函数初始化

  • 派生类可能有多个 CTor,更多地方需要忘记

唯一的缺点:多了一点输入——只要你不计算额外的“我今天有点懒,所以不要忘记在所有派生类构造函数中初始化 m_a”

如评论中所述,“签名宣布要求”在 IMO 中足以使此成为默认模式,“另一种方式需要使 m_a 受到保护”也是如此。

关于c++ - 初始化基类成员的首选方法 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50325380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com