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

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

我有一个具有两个私有变量的基类,以及一个用于打印它们的公共方法。通过继承它,我得到了一个使用未继承到派生类的变量的方法。但是,它可以工作并使用基类构造函数提供的值调用该方法。

即使添加到派生自己的默认构造函数,以及相同的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
}
c++ inheritance encapsulation
1个回答
0
投票

base::print无法在derived中看到成员变量。您有几种选择:

  1. 如果您实际上希望protectedbase::x不同,请使用derived::x。>
  2. pxpy传递给base的构造函数:derived(int px = 3, int py = 3) : base(px, py) { }
  3. 使base::print成为virtual成员函数,并在derived中覆盖它。
  4. 哪种选项最好取决于您的要求。

© www.soinside.com 2019 - 2024. All rights reserved.