也许我是在担心什么。我希望数据成员严格遵循 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/