基类有时可以初始化派生类的成员吗?

问题描述 投票:0回答:1

SO是一场狗屎秀。感谢您的搭车。

c++ undefined-behavior
1个回答
6
投票

一般来说,家长可以访问孩子的会员。就像CRTP

但是,在析构函数和构造函数中访问它们会直接导致 UB。

 FooImpl::FooImpl() 
 {
    static_cast<Foo *>(this)->bar = 0;
 }

这是 UB,因为

Foo
和随后的
bar
尚未构造,并且您已经访问它(并修改它!)。同样,在析构函数中 -
bar
此时已经被删除。相反,您可以在
Initialize()
中创建具有相同主体的
FooImpl
方法,并在
Foo
的构造函数中调用它,那么它就是合法的。

© www.soinside.com 2019 - 2024. All rights reserved.