c++ - 如何初始化抽象基类的 protected 成员?

标签 c++ initializer-list abstract-base-class

也许我是在担心什么。我希望数据成员严格遵循 RAII 习惯用法。如何将抽象基类中的 protected 指针成员初始化为 null?

我知道它应该为空,但确保它被普遍理解不是更好吗?

将初始化代码放在初始化列表之外有可能无法运行。考虑到将这个指针分配到堆栈上的汇编操作,它们不能在多线程环境中以几乎相同的方式(作为 c'tor 主体)被中断,或者堆栈扩展是否保证是原子的?如果保证析构函数运行,那么即使处理器不以原子方式执行它,堆栈扩展也可能没有这样的保证吗?

这么简单的问题怎么会变得如此广泛?谢谢。

如果我能避免使用 std::库那该多好,我处于极简主义环境中。

最佳答案

也许你想多了。以下示例将基成员初始化为 null:

struct Base
{
    virtual ~Base() = 0; // or make something else pure; this is just an example

    Base() : p() { }           // p initialized to null
    Base(Foo * q) : p(q) { }   // another option

protected:
     Foo * p;
};

struct Derived : private Base
{
    // no extra work needed

    // maybe something like this...
    Derived(int a, bool c) : Base(new Foo(a * (c ? 2 : 3))) { }
};

派生构造函数首先调用基类构造函数,而那个构造函数又表示 Base::p 被初始化为零。

关于c++ - 如何初始化抽象基类的 protected 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9458253/

相关文章:

c++ toupper() 比较两个字符串

c++ - 用qt从postgres读写图像(大对象)

c# - 在 View 中显示从抽象基础派生的更多类型的最佳方式是什么?

python - 如何获得一个抽象数据类来传递mypy?

Python ABCs : registering vs. 子类化

C++ union 定义

c++ - Lambda函数,段错误预防

c++ - 提取 std::initializer_list<T> C++ 的一部分

c++ - 使用派生类成员进行父类的初始化

c++ - 函数 std::make_shared<vector> 的参数太多