我可以调用一个虚拟函数来初始化基类子对象吗
May I call a virtual function to initialize a base-class sub-object?
我知道在构造函数中不应该直接或间接调用虚拟函数,但这段代码运行良好
我在这里的东西安全吗?
#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 "Bn"
}
如果没有,以下(基于评论)是否是正确的解决方法?
// 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
};
调用构造函数和/或析构函数中的虚拟成员通常是可以的。
不过,在所有碱基初始化之前,ctor初始化器中的游戏是不同的:
12.6.2初始化基地和成员
[class.base.init]
[…]
在建对象可以调用14个成员函数(包括虚拟成员函数,10.3)。类似地,构造中的对象可以是typeid
运算符(5.2.8)或dynamic_cast
(5.2.7)的操作数。但是,如果在基类的所有mem初始化器完成之前,在ctor初始化器(或在从ctor初始化程序直接或间接调用的函数中)中执行这些操作,则操作的结果是未定义的
相关文章:
- C++初始化基类
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 使用成员的地址初始化基类是否合法?
- 初始化基类成员 (c++) 的首选方法
- 类的构造函数必须显式初始化基类
- OOP - 抽象类类型,初始化基类和派生类中的变量
- 初始化基类和派生类中的类成员变量
- 为什么 C++ 的创建者决定使用构造函数初始值设定项列表来初始化基类?
- 通过drived类模板值通过基类构造器初始化基类数组成员变量
- 使用派生的[C++]生成的参数初始化基类
- C++ 在派生类中初始化基类的 const int?
- C++是否要求您从其派生类初始化基类成员
- 通过 CRTP 使用派生类变量初始化基类静态常量变量
- 初始化基类,派生类的构造函数中没有默认构造函数
- 我可以调用一个虚拟函数来初始化基类子对象吗
- 如何初始化基类构造函数的向量
- 初始化基类
- 在派生类的构造函数的主体中初始化基类成员变量
- 初始化基类的引用成员