首页 文章

C - 访问基类的受保护/私有成员

提问于
浏览
2

我正在尝试一个小例子来练习继承和多态的概念 . 这是我的代码的简化版本:

class Shape {
protected:
    int length;
    int width;
public:
    virtual void setLength(int l) = 0;
    virtual void setWidth(int w) = 0;
};

class Rectangle : public Shape {
public:
    Rectangle(int l, int w)
    : length(l), width(w)
    { }

    void setWidth(int w) { width = w; }
    void setLength(int l) { length = l; }
};

int main() {
    Rectangle r(0,0);
}

我正在尝试运行上述程序 . 但是,当我编译rectangle.cc时,我收到以下错误

g++ -c rectangle.cc

rectangle.cc: In constructor 'Rectangle::Rectangle(int, int)':
rectangle.cc:13:5: error: class 'Rectangle' does not have any field named 'length'
rectangle.cc:13:16: error: class 'Rectangle' does not have any field named 'width'

据我所知,在公共继承中,基类的受保护成员成为派生类的受保护成员,并且应该能够像公共成员一样进行访问 . 这是不正确的?另外,如果长度和宽度是基类的私有成员,那么如何修改代码呢?

3 回答

  • 2

    不,基类的受保护成员不会成为派生类的受保护成员 . 与派生类不同,派生类可以访问基类的受保护成员,并且它们在派生类的名称空间中保持受保护(因此同样的东西适用于派生类的派生类,依此类推) .

    但是基类的受保护成员仍然是基类的成员,并且基类的构造函数仍然负责构造它们,而不是派生类的构造函数 .

  • 4

    据我所知,在公共继承中,基类的受保护成员成为派生类的受保护成员,并且应该能够像公共成员一样进行访问 . 这是不正确的?

    这基本上是正确的 . 可以在派生类中访问基类的公共成员和受保护成员( public inheritance doesn 't matter here - that only affects outside observers' access) . 但是,类成员(任何访问权限)只能在自己的类中初始化 . 在这种情况下,只有 Shape 可以初始化 lengthwidth - 它不会't matter that they' re protected ,如果它们是 publicprivate 则也是如此 .

    您必须添加一个构造函数来执行此操作,您的 Rectangle 构造函数可以简单地委托给它 . 无论 lengthwidth 的访问控制如何(只要 Shape 构造函数是 publicprotected ),这都有效:

    struct Shape {
        Shape(int l, int w) : length(l), width(w) { }
    };
    
    struct Rectangle {
        Rectangle(int l, int w) : Shape(l, w) { }
    };
    

    或者,为了完整性,您可以只分配它们,但绝对更喜欢让 Shape 初始化它们 . 此外,这仅适用于有问题的成员是 publicprotected

    Rectangle(int l, int w) {
        length = l;
        width = w;
    }
    

    请注意, setWidth()setLength() 函数没问题 - 您可以访问 Rectangle 成员函数中的受保护成员 . 只是不进行初始化 .

  • 1

    删除部分:length(l),width(w)如果你想在派生类中使用长度和宽度(继承),你可以只使用它的名称来使用它,例如length ... done ...如果你碰巧在派生类中有相同的命名字段'length',那么使用派生类的'length'使用this-> length ...

    继承时... public access说明符声明基类中的public在受基类保护的派生类中变为公共...

    当使用protected ... public和受保护的基类变得受保护

相关问题