如果基是通过模板继承的,则在派生构造函数中初始化基类成员

Initialize base class member in derived constructor if base is inherited via template

提问人:glades 提问时间:6/30/2023 最后编辑:Remy Lebeauglades 更新时间:7/1/2023 访问量:63

问:

鉴于我知道我的基类中存在某个成员,我如何使用我的模板派生类来引用它?即使我完全符合条件,它也不起作用:aa

演示

#include <iostream>
#include <string_view>
#include <memory>
#include <string>

struct base {
    int a;
};

template <typename ImplType>
struct derived : public ImplType {

    derived()
        : a{2}
    {}

    auto print() {
        std::cout << ImplType::a << std::endl;
    }
};

int main() {
    derived<base> d{};
    d.print();
}

收益 率:

<source>:14:11: error: class 'derived<ImplType>' does not have any field named 'a'
   14 |         : a{2}
      |           ^
C++ 模板 mixins 派生类

评论

0赞 Jarod42 7/1/2023
即使没有模板也是错误的,要么使用基类构造函数,要么在正文构造函数中分配它。a{2}

答:

5赞 273K 6/30/2023 #1

使用聚合基类初始化

#include <iostream>

struct base {
    int a;
};

template <typename ImplType>
struct derived : public ImplType {
    derived()
        : ImplType{2}
    {}

    auto print() {
        std::cout << ImplType::a << std::endl;
    }
};

int main() {
    derived<base> d{};
    d.print();
}

评论

1赞 glades 6/30/2023
好吧,如果 base 不是聚合怎么办?
0赞 273K 6/30/2023
如果它不是聚合,它有一个构造函数,对吧?然后在初始化列表中使用其构造函数。
0赞 glades 6/30/2023
我希望避免这种情况,因为假设我有 10 个可能的基类,它很快就会变得非常混乱:/
2赞 273K 7/1/2023
它闻起来有XY问题的味道。如果派生类限制、硬编码和访问基类的内容,那么它就是一个糟糕的设计。你要解决的实际任务是什么?
1赞 user1806566 7/1/2023
如果确实不想显式调用基类构造函数,则可以在构造函数的主体中分配 ImplType::a。但是,我同意@273K的观点,即如果有原因不能调用基类构造函数,则可能是设计问题。