С++抽象返回类型



我有以下的类结构:

struct A {
virtual void function() = 0;
};
struct B : A {
void function() override {
// ...implementation...
}
};
struct C {
virtual A a() = 0;
};
struct D : public C {
A a() {
return B{};
}
}

主要思想是:我并不真正关心D::a将返回什么类,我想要它拥有的唯一属性是function()成员函数. 因此,我将返回类型表示为具有此属性为虚拟的抽象类A,然后尝试返回从A派生的B对象。但这不起作用,给error: invalid abstract return type。你能建议一种在c++中达到预期效果的方法吗?

在c++中,你不能对对象做多态性,因为对象可以有不同的大小,并且在c++类型中有值语义。但是,您可以对引用和指针进行多态性。你的函数可以是:

A* a();
// or
A& a();

这确实意味着您可能在所有权方面有问题。你也可以返回一个智能指针:

unique_ptr<A> a();
  1. 你不能创建抽象类型的对象,你可以创建它们的指针。正如Ayxan所说,你也可以使用智能指针,但我建议你使用shared_ptr,因为它更舒适。
  2. 使用dynamic_castB转换为A
  3. 你忘了在第三个结构体的末尾添加;

正确的代码如下:

#include <iostream>
struct A {
virtual void function() = 0;
};
struct B : A {
void function() override {
std::cout << "EEAAAHHHHn";
}
};
struct C {
virtual A* a() = 0;
};
struct D : public C {
A* a() {
B *a = new B;
A *b = dynamic_cast<A*>(a);
return b;
}
};
int main()
{
D d;
A* a = d.a();
a->function();
return 0;
}

如果编译并运行代码,可以看到输出是"EEAAAHHHH"。我很高兴能帮助你,祝你成功。

最新更新