2011-01-06 66 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