c++ 我正在学习多态性,遇到了一个问题

6qfn3psc  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(120)

我创建了一个具有两个子类的抽象基类:

class Base {
public: 
    int a, b, c;
    virtual void unreal() = 0; 
};

class Sub1: public Base {
public:
    virtual void unreal() {}
};

class Sub2: public Base {
public:
    virtual void unreal() {}
};

我想创建一个可以传递两种类型参数的函数:

vector<Sub1> v1 and vector<Sub2> v2

插入其中,使用类似于:

Function(vector<Base&> v) {}

但没有成功。所以我想知道有办法吗?

6ie5vjzr

6ie5vjzr1#

使用C++20,您可以通过以下方式实现:

template<std::derived_from<Base> T>
void function(const std::vector<T>& v) {}

上面使用模板来适应任何类型的向量(通过允许函数接受const std::vector<T>&,其中T是一个模板参数),但是为了限制T只能从Base派生,我们在模板中添加了对T的限制,要求它是std::derived_from<Base>
编码:http://coliru.stacked-crooked.com/a/8aaa0c941fdc493e
在C++20之前,它需要一些更麻烦的SFINAE

template<typename T, std::enable_if_t<std::is_base_of_v<Base, T>>* Dummy = nullptr>
void function(const std::vector<T>& v) {}

代码:http://coliru.stacked-crooked.com/a/0b7d98a84b6139b7

bnlyeluc

bnlyeluc2#

是的,您可以使用对vector<Base>的引用将vector<Sub1>vector<Sub2>都传递到函数中:

void Function(vector<Base>& v) {}

这应该可以实现,因为Sub1和Sub2是从Base派生的类,对派生类的引用可以传递给对基类的引用。但是,该函数将无法修改向量中的对象,因为对象是通过引用传递给常量向量的。

相关问题