我有两个具有共同方法的结构,它们在接口中定义(我无法更改这些):
struct Interface {
virtual int Foo() = 0;
};
struct A : Interface {
virtual int Foo() override;
//A specific methods etc
};
struct B : Interface {
virtual int Foo() override;
//B specific methods etc
};
如果有一个需要接受接口的功能,那么它非常简单: //成员变量 std :: vector m_as;
int DoubleFoo( Interface& obj ) {
return obj.Foo() * 2;
}
DoubleFoo(m_as[0]);
但是如果有一个需要多个接口的功能那么它就不那么简单了:
int SumFoo( std::vector<Interface>& objs ) {
int sum = 0;
for (auto&& obj : objs ) {
sum += obj.Foo();
}
return sum;
}
因为如果我有std::vector<A>
的现有(例如成员)变量,我不能简单地做:
SumFoo(m_as);
相反,我必须将SumFoo更改为std::vector<Interface*>
,并且必须创建指向原始数组中元素的新指针向量。
或者只是在函数调用中强制转换它,这非常难看:
SumFoo((std::vector<Interface>&)m_as);
当涉及到需要它们的向量这样简单的东西时,如何才能轻松/巧妙地使用C ++中的接口?
我明白为什么我不能将一个子类传递给一个函数,因为对象切片等因为它是基类的值。但是为什么不是std::vector<Derived>*
到std::vector<Base>*
的强制转换。 Derived*
到Base*
是?
我想问题是你可以在向量中添加一个Base(),这会导致调用代码出现问题,因为它认为它是Derived的向量,但是你可以将参数设为const,而Base是抽象的反正。