首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的子类型多态性

c++中的子类型多态性
EN

Stack Overflow用户
提问于 2011-01-07 07:20:13
回答 3查看 1.1K关注 0票数 0

我在c++中有这个程序。

ref2.h:

代码语言:javascript
复制
#ifndef REF2_H
#define REF2_H
#include <iostream>
using std::cout;
using std::endl;

int   add_int_int(int a, int b) {return (a+b);}

class IntClass;

class Number {
    public:

        //return a Number object that's the results of x+this, when x is IntClass
        virtual Number& addInt(IntClass& x) = 0;

        //Print the number stored in the object
        virtual void print_number() = 0;
    }

class IntClass : public Number {

    private:
        int my_number;

    public:
        //Constructor
        IntClass(int n):my_number(n) {}

        //returns the number stored in the object
        int get_number()  {return my_number;}

        //print the number stored in the object
        void print_number() {cout << my_number << endl;}

        Number& addInt(IntClass& x);
    }

Number& IntClass::addInt(IntClass& x)
{
    int n = add_int_int(my_number, x.get_number());
    IntClass elem = IntClass(n);
    IntClass &ref = elem;
    return ref;     
}

#endif

test.cpp

代码语言:javascript
复制
#include "ref2.h"
#include <iostream>
using std::cout;
using std::endl;


int main() {    
    cout << "Testing subtyping polymorphism:" << endl;
    IntClass ia(1);
    IntClass ib(2);
    Number& num = ia.addInt(ib);     num.print_number();  //should be: 3
}

我没有发现我的错误。有没有人能帮我?

EN

回答 3

Stack Overflow用户

发布于 2011-01-07 07:24:28

您将在addInt()中返回一个对局部变量的引用。别干那事。编译器应该已经警告过你了。

票数 5
EN

Stack Overflow用户

发布于 2011-01-07 07:29:31

返回对数字的引用的概念(在这种情况下)是有缺陷的。把引用想象成一个指针。addInt函数在堆栈上分配一个新的IntClass对象,然后返回对它的引用。

当函数返回时,IntClass的内存被释放,因此引用指向垃圾。

您应该返回一个指向数字(数字*)的指针,并且需要使用new IntClass来创建一个数字。然后,当您使用完它时,还需要在它上调用delete

票数 2
EN

Stack Overflow用户

发布于 2011-01-07 07:23:37

addInt()返回时,您返回的是对本地对象的引用,该对象超出了范围:

代码语言:javascript
复制
IntClass elem = IntClass(n);
IntClass &ref = elem;
return ref;    
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4621060

复制
相关文章

相似问题

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