首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对泛型函数使用继承

对泛型函数使用继承
EN

Stack Overflow用户
提问于 2013-03-09 10:05:36
回答 3查看 97关注 0票数 1

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

例如:

代码语言:javascript
运行
复制
#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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-09 10:09:27

您正在寻找的是所谓的子类型多态性;在C++中,只有引用类型才允许多态virtual函数调用按照您的预期工作。您可以使用引用:

代码语言:javascript
运行
复制
void print_function(base& item){
    item.print();
}

或指针:

代码语言:javascript
运行
复制
void print_function(base* item){
    item->print();
}

您所做的工作是按值传递对象,仅复制对象的base部分-这称为切片

代码语言:javascript
运行
复制
void print_function(base item){
    item.print();
}

请注意,由于您的print()成员函数不修改对象,因此可以而且应该将其声明为const。另外,参数列表中的(void)是C风格的,在C++中是多余的;请改用()

代码语言:javascript
运行
复制
virtual void print() const {
    cout << "Base" << endl;
}

const是签名的一部分,因此子类也必须指定它:

代码语言:javascript
运行
复制
virtual void print() const override {
    cout << "inherit_a" << endl;
}

然后,print_function()可以接受对const对象的引用:

代码语言:javascript
运行
复制
void print_function(const base& item){
    item.print();
}

或指向const对象的指针:

代码语言:javascript
运行
复制
void print_function(const base* item){
    item->print();
}

这说明print_function()也不会修改它的参数。

票数 4
EN

Stack Overflow用户

发布于 2013-03-09 10:10:33

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

您要查找的是对base的引用,以防止切片并允许值保持其原始类型

代码语言:javascript
运行
复制
void print_function(base& item){
  item.print();
}
票数 1
EN

Stack Overflow用户

发布于 2013-03-09 10:09:45

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15306367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档