【问题标题】:C++ inheritance: Can't access private element of base classC ++继承:无法访问基类的私有元素
【发布时间】:2013-09-09 14:51:21
【问题描述】:

我有一个基类:

class Base
{
public:
    functions...
private:
    std::vector<float> privateElement;
}

还有一个派生的:

class Derived : public Base
{
public:
    functions...
    Derived(anotherElement) : privateElement(anotherElement)
    {

    }
}

我现在的问题是每次我尝试构建我的项目时,编译器(gcc 4.7.2)总是抱怨无法访问privateElement,比如:

class Derived does not have any field named privateElement
std::vector<float> Base::privateElement is private

有人可以帮我吗?

【问题讨论】:

  • 然后呢?这就是private 的设计目的?!?

标签: c++ inheritance private public derived-class


【解决方案1】:

首先,基类的private 成员不能 可从派生类访问

现在即使你修复它并使它成为protected(或public),那么这将仍然不正确,因为你不能初始化派生类的 mem-init-list 中的基类成员。这没有意义,因为到派生类 mem-init-list 执行时,基类的成员已经初始化了,语法: protectedElement(xyz) 会让编译器认为protectedElement派生类的成员,而不是基类类的成员!

看到此错误即使在保护后

main.cpp: In constructor ‘Derived::Derived(std::vector<float>)’:
main.cpp:20:37: error: class ‘Derived’ does not have any field named ‘protectedElement’
     Derived(std::vector<float> v) : protectedElement(v)
                                     ^

Online demo

正确的做法是为基类定义一个构造函数,并从派生类的初始化列表中调用它。

希望对您有所帮助。

【讨论】:

  • 那么当使用基类的构造函数时,是在派生类中创建privateElement还是我实际上是在使用基类的对象?
  • @BlackMamba:试着做你从我的帖子中理解的事情。如果您遇到任何问题,请告诉我们(然后您也发布代码)。
  • 好的,这解决了我的初始化问题,但现在我面临构造函数的另一个问题:我想用 privateElement 的元素初始化另一个对象,但是当我尝试像这样使用它时: Derived(anotherElement ) : Base(anotherElement), randomElement(privateElement[0], privateElement[1]) { } 它抱怨 privateElement 是私有的。初始化后如何访问这个元素?
【解决方案2】:

在不破坏封装的情况下做到这一点的正确方法是让基类提供一个我们可以从派生类调用的构造函数:

class Derived : public Base
{
public:
    functions...
    Derived(anotherElement) : Base(anotherElement)
    {

    }
}

class Base
{
public:
    Base(anotherElement):privateElement(anotherElement) { }
private:
    std::vector<float> privateElement;
}

【讨论】:

    【解决方案3】:

    派生类不能访问基类的私有部分。那是因为它们是私人的。如果您希望派生类可以访问基类的成员而不破坏封装,请使用protected

    【讨论】:

    • 没错,我没仔细看有问题的代码。
    猜你喜欢
    • 2011-06-18
    • 2011-12-22
    • 2013-09-27
    • 1970-01-01
    • 2018-12-12
    • 2012-01-05
    • 2014-09-20
    • 2020-02-07
    • 2017-03-16
    相关资源
    最近更新 更多