对不起,如果这是一个愚蠢的问题,但我正在努力学习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是C,则不能调用c.get_b(),因为C中没有这样的函数,C也不是从定义了get_b()的类派生的。
我会在C类中创建一个虚函数get_b()。
PS:我想你的意思是get_b而不是get_a。
您的代码中存在几个问题。首先,你的一些功能是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
。
我建议采取以下策略。
virtual
成员函数允许C
类型的对象(及其派生类型)将类型特定数据写入std::ostream
。
virtual std::ostream& write(std::ostream& out) const;
<<
运算符使用基类的任何派生对象。它可以使用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;