我有以下的类结构:
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();
- 你不能创建抽象类型的对象,你可以创建它们的指针。正如Ayxan所说,你也可以使用智能指针,但我建议你使用
shared_ptr
,因为它更舒适。 - 使用
dynamic_cast
将B
转换为A
。 - 你忘了在第三个结构体的末尾添加
;
。
正确的代码如下:
#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"。我很高兴能帮助你,祝你成功。