为什么多态在这种情况下不起作用?

Bel*_*loc 5 c++ polymorphism operator-overloading stream

SimpleClass.h

class SimpleClass
{
    int i;

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

SimpleClass.cpp

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

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

基础和派生类

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&);
Run Code Online (Sandbox Code Playgroud)

Base和Derived Classes.cpp

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

std::ostream& operator<<(std::ostream& out, const BaseClass& obj)
{
    obj.print(out);
    return out;
}
Run Code Online (Sandbox Code Playgroud)

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 ?
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*nko 20

virtual void print(std::ostream& out) const 
Run Code Online (Sandbox Code Playgroud)

没被覆盖

void print(std::ostream& out)
Run Code Online (Sandbox Code Playgroud)

(因为const).

  • +1.成员函数的`const`-ness是**签名的一部分**! (4认同)

Mar*_*som 8

你忘了派生类中const的定义了print.


Mr.*_*C64 5

在你DerivedClassprint()方法必须是const,像它在BaseClass:

void print(std::ostream& out) const
Run Code Online (Sandbox Code Playgroud)