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

Posted

技术标签:

【中文标题】派生类调用使用非继承成员的继承函数【英文标题】:Derived class calls an inherited function that uses non-inherited members 【发布时间】:2019-10-27 19:58:54 【问题描述】:

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

甚至通过添加到派生他自己的默认构造函数,和相同的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

【问题讨论】:

【参考方案1】:

base::print 看不到derived 中的成员变量。您有几个选择:

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

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

【讨论】:

我只是将 base::print 复制到了derived 中,而没有将其变为虚拟并且它起作用了... @Denomycor - 如果有人有指向base 的指针或引用并调用print,你会遇到麻烦。你真的很想成功virtual

以上是关于派生类调用使用非继承成员的继承函数的主要内容,如果未能解决你的问题,请参考以下文章

c++继承总结

详解C++中基类与派生类的转换以及虚基类

4月14日继承与多态

生成一个派生类对象时,调用基类和派生类构造函数按啥次序

《面向对象程序设计》高手进~~~~~~~~~~~~!!

面向对象3大特性之一:继承