对通用函数使用继承

时间:2013-03-09 02:05:36

标签: c++ inheritance

我正在尝试创建一个包含多个子项的模板类,这些子项覆盖模板的方法(我相信我这样做了)。然后我想要一个可以与所有孩子一起工作的单一功能。

例如:

#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}}。这样的事情可能吗?

3 个答案:

答案 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