我有一个基类:
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
愿任何人帮助我吗?
答案 0 :(得分:4)
首先,基类的private
成员从派生类 可访问。
现在即使你修复了它并使其成为protected
(或public
),那么这仍然是不正确的,因为你不能初始化派生类的mem-init-list中的基础成员。它没有意义,因为当派生类mem-init-list执行时,基类的成员已经初始化,语法: protectedElement(xyz)
将使编译器认为{{ 1}}是派生类的成员,而不是 base 类的成员!
即使在保护后 ,也会看到此错误。
protectedElement
正确的方法是为基类定义构造函数,并从派生类的初始化列表中调用它。
希望有所帮助。
答案 1 :(得分:1)
在不破坏封装的情况下执行此操作的正确方法是基类提供可以从派生类调用的构造函数:
class Derived : public Base
{
public:
functions...
Derived(anotherElement) : Base(anotherElement)
{
}
}
class Base
{
public:
Base(anotherElement):privateElement(anotherElement) { }
private:
std::vector<float> privateElement;
}
答案 2 :(得分:-1)
派生类无法访问基类的私有部分。那是因为他们是私人的。如果希望派生类在不破坏封装的情况下访问基类的成员,请使用protected
。