class Base
{
protected:
int data;
public:
virtual int getData() { return data; }
virtual void setData(int value) { data = value; }
};
class Child : protected Base
{
public:
void setData(int value)
{
Base::setData(value);
cout << "Data is set.\n";
}
};
class Worker
{
private:
Child obj;
public:
void setGlobalData(int val)
{
obj.setData(val); // This is normal
}
int getGlobalData()
{
return obj.getData(); // Line 140, Error
}
};
使用Worker类编译文件时出错:
Base.hpp: In member function ‘int Worker::getGlobalData()’:
Base.hpp:22:19: error: ‘virtual int Base::getData()’ is inaccessible
Worker.cpp:140:34: error: within this context
Worker.cpp:140:34: error: ‘Base’ is not an accessible base of ‘Child’
答案 0 :(得分:2)
你真的让它成为公共基类吗?
// vvvvvv important
class Child : public Base
否则它是私有的,你会得到类似于你所拥有的错误,即:
'Base'不是'Child'的可访问基础
答案 1 :(得分:1)
编译:
class Base
{
protected:
int data;
public:
virtual int getData() {return data;}
virtual void setData(int value) { data = value; }
};
class Child : public Base
{
public:
void setData(int value)
{
Base::setData(value);
cout << "Data is set.\n";
}
};
class Worker
{
private:
Child obj;
public:
void setGlobalData(int val)
{
obj.setData(val); // This is normal
}
int getGlobalData()
{
return obj.getData();
}
};
答案 2 :(得分:0)
class Worker
不是clas Worker
在Worker
班级中,obj.setData(val);
正在尝试访问Child
班级的私人会员。
答案 3 :(得分:0)
除了clas - &gt; class and virtua - &gt;虚拟你的代码完全没问题。这绝对没有错。因为字面意思由于拼写错误而无法编译,所以我怀疑您的原始代码有点不同,因为Child
中Base
的派生是私有的,或者getData
是私有的。
答案 4 :(得分:0)
由于当前现有版本的代码Child
通过Base
继承protected
进行了子类化,public
中的Base
函数变为protected
在Child
中,Worker
无法通过Child
对象访问它们。
答案 5 :(得分:0)
类Child
将类Base
作为protected
继承,因此Child::getData()
的客户端无法公开访问成员函数Child
。
正如其他所有人所说,将Base
的继承更改为public
是解决此问题的一种方法。
class Child: public Base
另请注意,将Child
对象转换为Base
类型也会使对象的函数Base::getData()
公开可访问。
return static_cast<Base *>(&obj)->getData();