C++ 继承-运算符重载

C++ 继承-运算符重载,c++,oop,C++,Oop,我有两个类,基类和派生类。基本上,我有一个向量,它是*base类型,包含一个基本对象和一个派生对象。我为这两个类都重载了输出操作符,但是当我为派生类打印向量时,会调用基本输出操作符,尽管我分别重载了它。我应该在程序中更改什么以更改输出: 12 30 到 ? 代码如下: #包括 #包括 使用名称空间std; 阶级基础{ int x; 公众: 基(int_x):x(x){ friend ostream&operator基于底层对象的动态分派仅适用于虚拟成员函数。它不适用于非成员函数或非虚拟成员函数

我有两个类,基类和派生类。基本上,我有一个向量,它是
*base
类型,包含一个基本对象和一个派生对象。我为这两个类都重载了输出操作符,但是当我为派生类打印向量时,会调用基本输出操作符,尽管我分别重载了它。我应该在程序中更改什么以更改输出:

12
30

?

代码如下:

#包括
#包括
使用名称空间std;
阶级基础{
int x;
公众:
基(int_x):x(x){

friend ostream&operator基于底层对象的动态分派仅适用于
虚拟
成员函数。它不适用于非成员函数或非
虚拟
成员函数

解决这个问题的一种方法是:

  • 使用基本类型使用
    friend
    函数
  • obj
    的参数类型更改为
    const
    引用
  • 从该函数中,调用
    virtual
    成员函数来执行实际工作
  • 类基{
    int x;
    公众:
    基(int_x):x(x){
    虚拟std::ostream&write(std::ostream&out)常量
    {
    
    return(我不知道你可以声明和定义一个friend函数!我可以建议使用智能指针而不是那些原始指针和内存泄漏吗?我只是写了这段代码来说明我想在其他更大的代码中做什么。顺便说一句,谢谢。
    12
    30 31
    
    class base {
        int x;
    public:
        base(int _x) : x(_x) {}
    
        virtual std::ostream& write(std::ostream& out) const
        {
           return (out << x);
        }
    
        // Change obj to be a const reference
        friend std::ostream& operator<<(std::ostream& out, base const& obj)
        {
            return obj.write(out);
        }
    };
    
    class derived : public base {
        int y;
    public:
        derived(int _x, int _y) : base(_x), y(_y) {}
    
        virtual std::ostream& write(std::ostream& out) const
        {
           // Let the base class take care of its part.
           base::write(out);
    
           // Now take care of this class part.
           return ( out << ' ' << y);
        }
    
        // This is useless now.
        // friend ostream& operator<<(ostream& out, derived obj) {
        //         return out << (base) obj << ' ' << obj.y;
        // }
    };