调用未知的虚拟方法 child class
Calling virtual methods of unknown child class
我有以下设置:
class Parent {
virtual void foo(int x) = 0;
};
class Son : public Parent {
void foo(int x) {};
};
class Daughter : public Parent {
virtual void foo(int x) {};
};
如果我有 vector<Parent> parents
并且我将通过带有循环的向量,如下所示:
for (int i = 0; i < parents.size(); i++) {
Parent s = parents[i];
s.foo(-1);
}
如何称呼 children' foos(他们可能是儿子或女儿)?我目前收到两个错误:
Variable type 'Parent' is an abstract
Variable type 'Parent' is an abstract class
首先,您必须使 Son
和 Daughter
派生出 class 的 Parent
:
class Son : public Parent {
...
};
class Daughter : public Parent {
...
};
那么,要有一个多态对象的向量,你不能在其中存储对象。您必须采用指向对象的指针向量才能使多态性起作用。
vector<Parent*> parents;
或更好:
vector<shared_ptr<Parent>> parents;
为什么?
- 无法实例化父对象,因为它是抽象的 class。您只能创建它的派生 classes。
- 如果 Parent 不是抽象的,您的代码可以工作,但是通过将 Son 或 Daughter 放入向量中,它将是 sliced。
我有以下设置:
class Parent {
virtual void foo(int x) = 0;
};
class Son : public Parent {
void foo(int x) {};
};
class Daughter : public Parent {
virtual void foo(int x) {};
};
如果我有 vector<Parent> parents
并且我将通过带有循环的向量,如下所示:
for (int i = 0; i < parents.size(); i++) {
Parent s = parents[i];
s.foo(-1);
}
如何称呼 children' foos(他们可能是儿子或女儿)?我目前收到两个错误:
Variable type 'Parent' is an abstract
Variable type 'Parent' is an abstract class
首先,您必须使 Son
和 Daughter
派生出 class 的 Parent
:
class Son : public Parent {
...
};
class Daughter : public Parent {
...
};
那么,要有一个多态对象的向量,你不能在其中存储对象。您必须采用指向对象的指针向量才能使多态性起作用。
vector<Parent*> parents;
或更好:
vector<shared_ptr<Parent>> parents;
为什么?
- 无法实例化父对象,因为它是抽象的 class。您只能创建它的派生 classes。
- 如果 Parent 不是抽象的,您的代码可以工作,但是通过将 Son 或 Daughter 放入向量中,它将是 sliced。