0

我有一个基类:

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

有人可以在这里帮助我吗?

4

3 回答 3

4

首先,派生类不能访问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)
                                     ^

在线演示

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

希望有帮助。

于 2013-09-05T17:01:02.753 回答
1

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

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

    }
}

class Base
{
public:
    Base(anotherElement):privateElement(anotherElement) { }
private:
    std::vector<float> privateElement;
}
于 2013-09-05T17:12:00.883 回答
-1

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

于 2013-09-05T16:58:28.413 回答