派生类调用使用非继承成员的继承函数

Derived class calls an inherited function that uses non-inherited members

本文关键字:继承 成员 函数 调用 派生      更新时间:2023-10-16

我有一个基类,它有两个私有变量,还有一个用于打印它们的公共方法。通过从中继承,我得到了一个使用未继承到派生类的变量的方法。然而,它可以使用基类构造函数给定的值来工作和调用该方法。

甚至通过添加派生到自己的默认构造函数,以及相同的int x,y;变量,具有不同的默认值,该方法打印基类的默认值。为什么会发生这种情况,我该如何避免?我知道有受保护的成员,但这里发生了什么?我第一次尝试使用空派生类(没有构造函数和变量(,结果是一样的。它如何使用非继承的变量?

class base {
private:
int x, y;
public:
base(int px=1, int py=2)
:x(px), y(py)
{}
inline void print() const {
cout << x << ", " << y << 'n';
}
};
class derived : public base {
private:
int x, y;
public:
derived(int px = 3, int py = 3)
:x(px), y(py)
{}
};
int main{
derived e;
e.print(); // prints 1, 2
}

base::printderived中看不到成员变量。你有几个选择:

  1. 如果确实希望base::xderived::x不同,请使用protected
  2. pxpy传递给base的构造函数:derived(int px = 3, int py = 3) : base(px, py) { }
  3. base::print设为virtual成员函数,并在derived中覆盖它

哪个选项最好取决于您的要求。