1

我正在尝试创建一个具有多个子级的模板类,这些子级覆盖模板的方法(我相信我这样做是正确的)。然后我想要一个可以与所有孩子一起使用的函数。

例如:

#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);
}

这会像我期望的那样打印“base”,但是我希望它使用inherit_a's print 方法或inherit_b's print 方法(如果inherit_b被归为print_function. 这样的事情可能吗?

4

3 回答 3

4

您正在寻找的是所谓的subtype polymorphism;在 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-09T02:09:26.680 回答
1

这里的问题是您正在base获取print_function. 即使您传递一个inherit_a实例,它也会导致创建一个新对象,该对象被键入base(称为对象切片)。在print_function运行点它不再是一个inherit_a值,因此不会调用派生方法。

您正在寻找的是base防止切片并允许值保持其原始类型的参考

void print_function(base& item){
  item.print();
}
于 2013-03-09T02:10:33.297 回答
0

“这样的事情可能吗?” - 是的,它被称为多态性

于 2013-03-09T02:09:44.683 回答