假设我有一个带有虚函数的类和一个以不同方式实现虚函数的派生类。假设我还有一个用于存储派生类的基类向量。如何在不事先知道派生类是什么的情况下,在向量中执行派生类的虚函数?说明问题的最小代码:
#include <iostream>
#include <vector>
class Foo {
public:
virtual void do_stuff (void) {
std::cout << "Foo\n";
}
};
class Bar: public Foo {
public:
void do_stuff (void) {
std::cout << "Bar\n";
}
};
int main (void) {
std::vector <Foo> foo_vector;
Bar bar;
foo_vector.resize (1);
foo_vector [0] = bar;
bar.do_stuff (); /* prints Bar */
foo_vector [0].do_stuff (); /* prints Foo; should print Bar */
return 0;
}
答案 0 :(得分:14)
你做不到。向量中的对象将被切片 - 任何派生类实例数据都将被切断,因此调用该方法将是一个非常糟糕的主意。
另一方面,如果你有一个指针的向量,那么你只需要调用虚方法,并调用派生类版本。
答案 1 :(得分:2)
您实际调用的类不是Bar类,而是一类Foo。你在foo_vector [0] = bar;
做的是调用隐式operator =,它正在尽最大努力使智能发生。虽然内存空间仍然是Foo的大小,但它永远不会是一个Bar。
答案 2 :(得分:0)
使用虚函数时,可以使用指向对象的指针。这样在运行时调用确切的函数(“如何在不事先知道派生类是什么的情况下在向量中执行派生类的虚函数?”这里你的意思可能是“运行时”)。
使用将函数标记为虚拟的是,您要求编译器推迟或计算出在运行时调用该函数的对象的“TYPE”,而不是通常的“编译时间”。这是通过使用指向对象的指针来实现的。所以把它放在一个简单的行“使用指向对象的指针来利用虚函数”。