gpt4 book ai didi

c++ - 将多态成员变量实例化为适当的类型

转载 作者:行者123 更新时间:2023-11-30 03:53:39 29 4
gpt4 key购买 nike

我有一个基类,其中包含一个成员变量 std::unique_ptr< Base > 接下来。我有几个 Base 的派生类。

我有一个非虚函数 Base::grow() 接下来初始化。 next 将始终 指向调用 grow 的对象类型的对象。

通过 Base::grow() 中的虚函数调用可以保证 next 是正确的类型。

为每个派生类创建一个虚函数既麻烦又容易出错,因此我的问题是:我可以更简洁地做到这一点吗?

我当前的最小工作示例如下所示:

#include <iostream>
#include <memory>

class Base{
public:
static const unsigned SIZE = 3;
std::unique_ptr<Base> next;
void grow(unsigned index){
if (index < SIZE){
print();
next = get_new();
next.get()->grow(index + 1);
}
}

virtual std::unique_ptr<Base> get_new(){
return std::unique_ptr<Base>(new Base());
//return std::move(std::unique_ptr<Base>(new Base())); (move not nec. see comments)
}

virtual void print (){
std::cout << "a Base ";
}
};

class Derived: public Base{
public:
virtual void print (){
std::cout << "a Derived ";
}
virtual std::unique_ptr<Base> get_new(){
return std::unique_ptr<Base>(new Derived());
}
};

int main(){
std::unique_ptr<Base> b;
b = std::unique_ptr<Base> (new Base());
b->grow(0);

std::unique_ptr<Base> c;
c = std::unique_ptr<Base> (new Derived());
c->grow(0);
}

输出是正确的:a Base a Base a Base a Derived a Derived a Derived

总而言之:我想要一个解决方案来消除繁琐的 get_new,我希望 Base::grow 根据调用对象的类型来确定要创建的类型。我考虑过使用 decltype,但没有成功。

与尝试在运行时确定类型相关的代码片段:

typedef std::remove_reference<decltype(*this)>::type DynamicBase;
next = std::unique_ptr<DynamicBase>(new DynamicBase());

上面的 DynamicBase 始终被确定为 Base,即使 this 是指向 Derived 的指针也是如此

最佳答案

你想要的是不可能的:你需要至少一个虚函数调用,即在每个派生中重写的虚方法。例如,考虑在另一个编译单元中定义派生类的情况。如果不使用多态,基类的代码如何获取一个新的未知类型的派生对象?

关于c++ - 将多态成员变量实例化为适当的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30033763/

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