gpt4 book ai didi

c++ - 使用CRTP时如何调用派生类的构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:23 25 4
gpt4 key购买 nike

我有以下设置:

#include <iostream>
template <typename T>
struct feline {
void roar() noexcept {
static_cast<T*>(this)->do_roar();
}
feline() noexcept {
std::cerr << "Feline ctor" << std::endl;
}
};

struct lion : public feline<lion> {
lion() noexcept : feline() {
std::cerr << "Lion ctor" << std::endl;
}
void do_roar() noexcept {
std::cerr << "Lion roar" << std::endl;
}
};

struct tiger : public feline<tiger> {
tiger() noexcept : feline() {
std::cerr << "Tiger ctor" << std::endl;
}
void do_roar() noexcept {
std::cerr << "Tiger roar" << std::endl;
}
};

int main()
{
feline<lion> lion;
lion.roar();
feline<tiger> tiger;
tiger.roar();
}

当我执行它时,我得到以下结果:

Feline ctor
Lion roar
Feline ctor
Tiger roar

这意味着永远不会调用 Lion 和 Tiger 的构造函数。我怎样才能做到这一点?

最佳答案

因为您永远不会创造出真正的狮子。

CRTP 需要实际类的对象才能正常工作。

请记住,基类永远不会直接实例化子类,因为它是强制类支持某些功能而不是经典继承。

您的代码可能会崩溃,但它不会,那是因为函数 do_roar不访问任何私有(private)变量。尝试将一些成员添加到 lion并在 do_roar 中使用它们, 你会看到...

如果你想要狮子,请使用 lion类,feline<lion>只是 feline<T> 的一个实例其中 T = lion .

关于c++ - 使用CRTP时如何调用派生类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47442195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com