2013-01-17 17 views
5

SimpleClass.hइस मामले में बहुलकवाद क्यों काम नहीं कर रहा है?

class SimpleClass 
{ 
    int i; 

    public: 
    SimpleClass() : i(0) {} 
    SimpleClass(int j) : i(j) {} 
    friend std::ostream& operator<<(std::ostream&, const SimpleClass&); 
}; 

SimpleClass.cpp

#include <ostream> 
#include "SimpleClass.h" 

std::ostream& operator<<(std::ostream& out, const SimpleClass& obj) 
{ 
    out << "SimpleClass : " << obj.i << '\n'; 
    return out; 
} 

बेस और व्युत्पन्न Classes.h

class BaseClass 
{ 
    protected: 
    int i; 

    public: 
    BaseClass() : i(0) {} 
    BaseClass(int j) : i(j) {} 
    virtual void print(std::ostream& out) const { out << "BaseClass : " << i << '\n'; } 
}; 

class DerivedClass : public BaseClass 
{ 
    int j; 

    public: 
    DerivedClass() : BaseClass(), j(0) {} 
    DerivedClass(int m, int n) : BaseClass(m), j(n) {} 
    void print(std::ostream& out) { out << "DerivedClass : " << i << ' ' << j << '\n'; } 
}; 

std::ostream& operator<<(std::ostream&, const BaseClass&); 

बेस और व्युत्पन्न Classes.cpp

#include <ostream> 
#include "Base and Derived Classes.h" 

std::ostream& operator<<(std::ostream& out, const BaseClass& obj) 
{ 
    obj.print(out); 
    return out; 
} 

main.cpp

#include <iostream> 
#include "SimpleClass.h" 
#include "Base and Derived Classes.h" 

int main() 
{ 
    SimpleClass simple(10); 
    std::cout << simple; 
    BaseClass base(100); 
    std::cout << base; 
    DerivedClass derived(100, 200); 
    std::cout << derived;     // Doesn't call derived.print(), but base.print() instead. Why ? 
} 
+0

क्या (विशेष) काम नहीं कर रहा? आप क्या उम्मीद कर रहे हैं, और परिणाम से यह अलग कैसे है? – iamnotmaynard

+0

प्रिंट() फ़ंक्शन बेस क्लास में है, लेकिन व्युत्पन्न कक्षा में गैर-कॉन्स। हस्ताक्षर एक जैसा होना चाहिए। – tp1

+0

@ tp1 यह सही है। मैं आपका जवाब स्वीकार करूंगा। धन्यवाद। – Belloc

उत्तर

20
virtual void print(std::ostream& out) const 

द्वारा

void print(std::ostream& out) 

(const की वजह से) ओवरराइड नहीं कर रहा है।

+4

+1। एक सदस्य समारोह की 'const'-ness ** हस्ताक्षर का एक हिस्सा ** है! – Nawaz

8

आप व्युत्पन्न कक्षा में print की परिभाषा पर const भूल गए हैं।

5

अपने DerivedClassprint() विधि में const होना चाहिए, जैसे कि यह BaseClass में बताया गया है:

void print(std::ostream& out) const 
संबंधित मुद्दे