我正在尝试创建一个包含多个子项的模板类,这些子项覆盖模板的方法(我相信我这样做了)。然后我想要一个可以与所有孩子一起工作的单一功能。
例如:
#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);
}
这会像我期望的那样打印“基础”,但如果将inherit_a
归咎于{{{I}},我希望使用inherit_b
的打印方法或inherit_b
的打印方法1}}。这样的事情可能吗?
答案 0 :(得分:4)
您正在寻找的是子类型多态性;在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()
也不会修改其论点的文件。
答案 1 :(得分:1)
此处的问题是您将base
值提取到print_function
。即使您传递inherit_a
实例,它也会导致创建一个新对象,该对象将被键入base
(称为对象切片)。在print_function
运行时,它不再是inherit_a
值,因此不会调用派生方法。
您要找的是base
引用以防止切片并允许值保持其原始类型
void print_function(base& item){
item.print();
}
答案 2 :(得分:0)
“这样的事情可能吗?” - Yeap,它被称为polymorphism。