加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 是否可以在运行时切换到不同的基类构造函数?

发布时间:2020-12-16 02:59:56 所属栏目:百科 来源:网络整理
导读:假设我正在编写Derived,并且必须继承自Base,我不能控制,并有两个单独的构造函数和一个已删除的副本和移动构造函数: struct Base { Base(int i); Base(const char *sz); Base(const Base) = delete; Base(const Base) = delete;};struct Derived { Derived(b
假设我正在编写Derived,并且必须继承自Base,我不能控制,并有两个单独的构造函数和一个已删除的副本和移动构造函数:
struct Base {
    Base(int i);
    Base(const char *sz);
    Base(const Base&) = delete;
    Base(const Base&&) = delete;
};

struct Derived {
    Derived(bool init_with_string);
};

现在,根据another_param的值,我必须使用构造函数或另一个初始化我的基类;如果C有点不那么严格,那就像:

Derived::Derived(bool init_with_string) {
    if(init_with_string) {
        Base::Base("forty-two");
    } else {
        Base::Base(42);
    }
}

(这对于在直线表达式中计算值传递给基类构造函数/字段初始化函数是非常麻烦的所有情况也是有用的,但我是离题的)

不幸的是,即使我没有看到这种东西的特定代码或对象模型的障碍,这是无效的,我不能想到容易的解决方法.

有没有办法,我不知道?

解决方法

静态功能可以在这里工作
struct Base {
    Base(int i);
    Base(const char *sz);
    Base(const Base&) = delete;
    Base(const Base&&) = delete;
};

struct Derived : Base {
   using Base::Base;

   static Derived construct(bool with_string) {
      if(with_string) return { "forty-two" };
      return { 42 };
   }
};

请注意,这不需要移动,也不需要复制构造函数.如果要将其作为本地使用,则需要将其绑定到引用,以避免移动它

auto &&w = Derived::construct(true);
auto &&wo = Derived::construct(false);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读