【发布时间】:2014-11-03 11:24:27
【问题描述】:
我知道在构造函数中不应该直接或间接调用虚函数,但是这段代码运行良好。
我这里的东西安全吗?
#include <iostream>
#include <string>
struct A {
A (const std::string& name) {std::cout << name << std::endl;}
virtual std::string tag() const = 0;
};
struct B: A {
B() : A (tag()) {}
virtual std::string tag() const override {return "B";}
};
int main() {
B b; // Output gives "B\n"
}
如果不是,以下(基于评论)是否是正确的解决方法?
// Replacement for class B:
struct B: A {
B() : A (name()) {}
virtual std::string tag() const override {return name();}
private:
static std::string name() {return "B";} // use static function
};
【问题讨论】:
-
“我知道虚函数不应该在构造函数中直接或间接调用”...这是一个新的...
-
@重复数据删除器。根据您的评论,我在上面写了一个不同的版本。这是你的建议吗?
-
@Deduplicator 什么时候是 UB?!
-
@LightnessRacesinOrbit:恢复和扩展评论:在 ctor-initializer 中调用虚函数是 UB,因为标准在 12.6.2 (14) 中是这样说的。
-
@Deduplicator Touché。具体来说,它是 UB 只是因为基础尚未完成初始化。
标签: c++ constructor virtual ctor-initializer