获取函数不适用于虚方法

问题描述 投票:0回答:3

对不起,如果这是一个愚蠢的问题,但我正在努力学习cpp ..

所以我正在练习课程,我对这段代码感到怀疑,这里让我告诉你

class C {
     private:
         //pv
     protected:
         //pt
     public:
         //constructors etc.

         virtual ostream& print(ostream&, const C&) const;
};

Class D: public C {
      private:
         int b;
      public:
         //constructors etc.
         int get_b() const {return b;}

         virtual ostream& print(ostream&, const C&) const;
};

所以,假设我想打印我的类的成员变量,我可以(应该?)使用get函数,对吧?但我的问题是,当我调用虚函数并尝试打印成员变量时

//in cpp

ostream& operator<<(ostream& os, const D& d) {

    d.print(os);
    return os;
}
ostream& D::print(ostream& os, const C& c) const {

    os<<(C&)c;
    os<<c.get_b();
    return os;
}

这是问题,它说[Error] 'const class C' has no member named 'get_a'并且这是绝对正确的,但那么我如何使用需要在层次结构中获取/设置其他类的虚函数?根据定义,D应该继承每个公共方法,除了一些,这意味着get / set函数也应该是D的函数,对吧?对不起,如果我太长了!

c++ class get virtual
3个回答
0
投票

如果c是C,则不能调用c.get_b(),因为C中没有这样的函数,C也不是从定义了get_b()的类派生的。

我会在C类中创建一个虚函数get_b()。

PS:我想你的意思是get_b而不是get_a。


0
投票

您的代码中存在几个问题。首先,你的一些功能是const而不是其他功能。如果他们应该是“相同的”虚拟功能,那么他们必须匹配。

那么显而易见的问题是:你为什么要在顶部传递C?你已经有this

virtual ostream& operator<<(ostream& os, const C& c) const {
    c.print(os);
    return os;
}

ostream& D::print(ostream& os) const override {
    os<<this->get_b();
    return os;
}

如果你有一个C或派生版本的实例,这将起作用,因为D是一个C,并且将调用覆盖的print


0
投票

我建议采取以下策略。

  1. 使用virtual成员函数允许C类型的对象(及其派生类型)将类型特定数据写入std::ostreamvirtual std::ostream& write(std::ostream& out) const;
  2. 使用非成员函数允许您使用<<运算符使用基类的任何派生对象。它可以使用virtual成员函数实现。 std::ostream& operator<<(std::ostream& out, C const& c) { return c.write(out); }

virtual成员函数的示例实现:

class C {

   public:

      virtual std::ostream& write(ostream& out) const
      {
         // Write data specific to this class
         // ...

         return out;
      }
};

class D: public C {

   private:

      int b;

   public:

      virtual std::ostream& write(ostream& out) const
      {
         // Call the base class to do its job first.
         C::write(out);

         // Write data specific to this class
         out << b;

         return out;
      }
};

此策略确保驻留在类inhertiance层次结构中特定级别的所有数据仅在该级别处理。基类不需要知道派生类这样做,派生类也不需要担心基类的工作方式。

现在,您可以使用:

D d{...};
std::cout << d << std::endl;
© www.soinside.com 2019 - 2024. All rights reserved.