2011-01-06 64 views
0

我在C++中有这个程序。C++中的子类型多态性

ref2.h:

#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

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

我不觉得我的错误。 如果有人能帮助我?

+0

今天的课程:启用您的警告! :) – Kos 2011-01-06 23:25:22

+2

什么错误? – Falmarri 2011-01-06 23:26:05

回答

1

你返回到本地对象超出范围时addInt()返回引用:

IntClass elem = IntClass(n); 
IntClass &ref = elem; 
return ref;  
3

你()返回在addInt局部变量的引用。不要这样做。编译器应该已经警告过你。

1

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

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

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