派生 class 调用使用非继承成员的继承函数
Derived class calls an inherited function that uses non-inherited members
我有一个基础 class,它有两个私有变量,还有一个 public 方法来打印它们。通过从它继承,我得到了一个使用未继承到派生 class 的变量的方法。但是,它可以工作并使用 base class 构造函数给出的值调用该方法。
甚至通过添加导出自己的默认构造函数,和int x,y一样;变量,具有不同的默认值,该方法打印基础 class 默认值。为什么会发生这种情况,我该如何避免?我知道受保护的成员,但这里仍然发生了什么?我首先尝试使用 derived class 为空(没有构造函数和变量),结果是一样的。它如何使用非继承的变量?
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::print
看不到 derived
中的成员变量。您有几个选择:
- 如果您确实希望
base::x
和 derived::x
不同,请使用 protected
。
- 将
px
和py
传递给base
的构造函数:derived(int px = 3, int py = 3) : base(px, py) { }
- 使
base::print
成为 virtual
成员函数并在 derived
中覆盖它。
哪个选项最好取决于您的要求。
我有一个基础 class,它有两个私有变量,还有一个 public 方法来打印它们。通过从它继承,我得到了一个使用未继承到派生 class 的变量的方法。但是,它可以工作并使用 base class 构造函数给出的值调用该方法。
甚至通过添加导出自己的默认构造函数,和int x,y一样;变量,具有不同的默认值,该方法打印基础 class 默认值。为什么会发生这种情况,我该如何避免?我知道受保护的成员,但这里仍然发生了什么?我首先尝试使用 derived class 为空(没有构造函数和变量),结果是一样的。它如何使用非继承的变量?
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::print
看不到 derived
中的成员变量。您有几个选择:
- 如果您确实希望
base::x
和derived::x
不同,请使用protected
。 - 将
px
和py
传递给base
的构造函数:derived(int px = 3, int py = 3) : base(px, py) { }
- 使
base::print
成为virtual
成员函数并在derived
中覆盖它。
哪个选项最好取决于您的要求。