【发布时间】:2019-04-05 21:58:14
【问题描述】:
对不起,如果这是一个愚蠢的问题,但我正在尽我最大的努力学习 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 的函数,对吧?对不起,如果我太长了!
【问题讨论】:
-
D 继承了 C 的所有(公共和受保护)成员,因此您可以从 D 的实例调用在 C 中定义的方法。但您正试图做相反的事情,即调用一个方法从 C 的实例在 D 中定义。
-
@Steve 你是对的!但这不是意味着要修改虚拟吗?因为我宣布它为 ostream& D::print(ostream& os, const C& c) const;从 C 的实例调用 D 中定义的方法只是意味着更改参数,不是吗?
-
我试过做:os
-
@Dave2222 1) 问题与
print方法无关。该错误指出class C没有名为get_a的方法。确实,您的class C没有这样的方法。再看一遍,您的示例中没有任何类具有这种方法(应该是get_b?),因此您的代码与您的错误不匹配。 2)“我试过做:os” 举个例子:我怀疑它,因为get_b不是静态方法. -
为什么
print得到第二个参数而不是使用this?