【发布时间】:2015-07-18 15:30:56
【问题描述】:
我一直以为我理解继承,但显然我不理解。我想从子类中调用同一父类的另一个实例的受保护成员函数,如以下示例代码所示:
#include <iostream>
class Parent {
protected:
void doStuff(){
std::cout << 5 << std::endl;
}
};
class Child : public Parent {
public:
void pubfunc(Parent* p){
p->doStuff();
}
};
int main(){
Child* c = new Child();
Parent* p = new Parent();
c->pubfunc(p);
return 0;
}
但是,此代码的编译失败并显示:
In member function ‘void Child::pubfunc(Parent*)’:
error: ‘void Parent::doStuff()’ is protected
error: within this context
我不想将Child 类设为Parent 类的friend,以避免前向声明和前向包含子类。另外,我不想公开doStuff,因为在错误的情况下使用它真的会弄乱Parent的内部结构。
为什么会发生这个错误,最优雅的解决方法是什么?
【问题讨论】:
-
你传递的那个
Parent不是你(这个)。因此,您无法访问它的父级受保护/私有接口。 -
另外,你的设计有点奇怪。一个孩子是一个父母?也许
Base和Derived会是更好的名字。
标签: c++ inheritance protected