2013-01-17 30 views
5

SimpleClass.hTại sao đa hình không hoạt động trong trường hợp này?

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

Base và nguồn gốc 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&); 

Base và nguồn gốc 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

gì (đặc biệt) không hoạt động? Bạn đang mong đợi điều gì, và điều này khác với kết quả như thế nào? Hàm – iamnotmaynard

+0

print() là const trong lớp cơ sở, nhưng không phải là const trong lớp dẫn xuất. Chữ ký cần phải giống nhau. – tp1

+0

@ tp1 Đúng vậy. Tôi sẽ chấp nhận câu trả lời của bạn. Cảm ơn. – Belloc

Trả lời

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

không ghi đè bởi

void print(std::ostream& out) 

(vì const).

+4

+1. 'const'-ness của một hàm thành viên là ** một phần ** của chữ ký! – Nawaz

8

Bạn đã quên const về định nghĩa print trong lớp dẫn xuất.

5

Trong DerivedClass phương pháp print() của bạn phải const, như đó là trong BaseClass:

void print(std::ostream& out) const 
Các vấn đề liên quan