C++ 从 parents 的向量中调用 child 的方法?
C++ call a child's method from a vector of parents?
假设您有以下 class:
class Parent
{
// methods and members go here
};
然后你创建一个 child 基于 parent:
class Child : public Parent
{
public:
someFunction();
};
现在 class Parent 没有 someFunction() 但 class Child 有。假设您有一个 Parent classes 的向量,并且您想要调用 child 的方法,假设该向量包含 parents 和 children,因为它们都是相同的基本类型。
std::vector<Parent> myContainer;
myContainer.push_back(a parent);
myContainer.push_back(a child);
myContainer[1].someFunction();
我怎样才能完成这项工作?我基本上是在尝试创建一个 parents 的矢量,但 children 也进入该矢量。我想调用一个 children 独有的方法。这可能吗?
您创建了一个包含 Parent
个对象的向量。这里没有多态性。向量包含值。如果你想要一个多态容器,你必须使用其他东西。
就像你做的那样
Parent myObject;
无论您以后对 myObject
做什么,它仍然是 Parent
。即使你这样做 myObject = Child()
.
多态性只适用于指针和引用,所以如果你创建一个指针向量,那么它是可能的。
class Parent
{
virtual void foo(){} //dummy function to make Parent polymorphic
};
class Child : virtual public Parent
{
public:
void about()
{
cout << "Child" << endl;
}
};
int main()
{
vector<Parent*> vec;
vec.push_back(new Parent());
vec.push_back(new Child());
for (int i = 0; i < vec.size(); i++)
{
Child *child = dynamic_cast<Child*>(vec.at(i));
if (child)
child->about();
}
return 0;
}
假设您有以下 class:
class Parent
{
// methods and members go here
};
然后你创建一个 child 基于 parent:
class Child : public Parent
{
public:
someFunction();
};
现在 class Parent 没有 someFunction() 但 class Child 有。假设您有一个 Parent classes 的向量,并且您想要调用 child 的方法,假设该向量包含 parents 和 children,因为它们都是相同的基本类型。
std::vector<Parent> myContainer;
myContainer.push_back(a parent);
myContainer.push_back(a child);
myContainer[1].someFunction();
我怎样才能完成这项工作?我基本上是在尝试创建一个 parents 的矢量,但 children 也进入该矢量。我想调用一个 children 独有的方法。这可能吗?
您创建了一个包含 Parent
个对象的向量。这里没有多态性。向量包含值。如果你想要一个多态容器,你必须使用其他东西。
就像你做的那样
Parent myObject;
无论您以后对 myObject
做什么,它仍然是 Parent
。即使你这样做 myObject = Child()
.
多态性只适用于指针和引用,所以如果你创建一个指针向量,那么它是可能的。
class Parent
{
virtual void foo(){} //dummy function to make Parent polymorphic
};
class Child : virtual public Parent
{
public:
void about()
{
cout << "Child" << endl;
}
};
int main()
{
vector<Parent*> vec;
vec.push_back(new Parent());
vec.push_back(new Child());
for (int i = 0; i < vec.size(); i++)
{
Child *child = dynamic_cast<Child*>(vec.at(i));
if (child)
child->about();
}
return 0;
}