我正在尝试创建一个包含多个子类的模板类,这些子类覆盖了模板的方法(我相信我这样做是正确的)。然后我想要一个单一的函数,可以与所有的孩子一起工作。
例如:
#include <iostream>
using namespace std;
class base{
public:
virtual void print(void){
cout << "Base" << endl;
}
};
class inherit_a : public base{
public:
virtual void print(void) override{
cout << "inherit_a" << endl;
}
};
class inherit_b : public base{
public:
virtual void print(void){
cout << "inherit_b" << endl;
}
};
void print_function(base item){
item.print();
}
int main(){
inherit_a item_a;
print_function(item_a);
return(0);
}发布于 2013-03-09 10:09:27
您正在寻找的是所谓的子类型多态性;在C++中,只有引用类型才允许多态virtual函数调用按照您的预期工作。您可以使用引用:
void print_function(base& item){
item.print();
}或指针:
void print_function(base* item){
item->print();
}您所做的工作是按值传递对象,仅复制对象的base部分-这称为切片
void print_function(base item){
item.print();
}请注意,由于您的print()成员函数不修改对象,因此可以而且应该将其声明为const。另外,参数列表中的(void)是C风格的,在C++中是多余的;请改用()。
virtual void print() const {
cout << "Base" << endl;
}const是签名的一部分,因此子类也必须指定它:
virtual void print() const override {
cout << "inherit_a" << endl;
}然后,print_function()可以接受对const对象的引用:
void print_function(const base& item){
item.print();
}或指向const对象的指针:
void print_function(const base* item){
item->print();
}这说明print_function()也不会修改它的参数。
发布于 2013-03-09 10:10:33
这里的问题是,您正在向print_function传入一个base值。即使您传递了一个切片实例,它也会导致创建一个类型为base的新对象(称为对象切片)。在print_function运行时,它不再是一个inherit_a值,因此不会调用派生方法。
您要查找的是对base的引用,以防止切片并允许值保持其原始类型
void print_function(base& item){
item.print();
}发布于 2013-03-09 10:09:45
“这样的事情是可能的吗?”--是的,它被称为polymorphism。
https://stackoverflow.com/questions/15306367
复制相似问题