我想定义一个抽象基类,然后将该类型的数组(显然充满了派生类的实例)作为函数参数,但是编译器对我大吼大叫。有任何想法吗?
例如(“ Testable”是抽象的,“ Vecteur”是具体的):
void Testeur::commencerTest(Testable testables[], int nTestables, string titre) {
cout << "\n" << titre << "\n";
for (int i=0; i < nTestables; i++) {
testables[i].afficher();
}
}
// in main function:
Vecteur v1 = Vecteur(1,2,3);
Vecteur v2 = Vecteur(4,5,6);
Vecteur vecteurs[] = { v1, v2 };
int nVecteurs = 2;
this->commencerTest(vecteurs, nVecteurs, "Some text");
编译器在上述代码的第一行说
invalid abstract type ‘std::Testable’ for ‘testables’
。如何将抽象类型的数组作为函数参数传递?
最佳答案
简短的答案是:您不能。数组在C ++中不是多态的。这是有充分理由的-例如What is object slicing?。记住这样做arr[i]
,编译器需要知道每个元素的大小(以计算地址偏移量);对于派生类型,这种计算通常是错误的。
您考虑使用功能模板,或者使用(智能)指针的数组/容器。