在Class1
的头文件中,我有:
class Class1 : Class2::Callback {
public:
//Class2::Callback method
virtual bool class2Method(int i);
}
在Class1.cxx
我有:
bool Class1::class2Method(int i) {
if (i == 1) return true;
return false;
}
在另一个地方我有:
IWantAClass2Callback((Class2::Callback)instanceOfClass1);
当我尝试编译时,我收到以下错误:
MyApp.cxx In constructor 'MyApp()':
MyApp.cxx:55:55: error: 'Class2::Callback is an inaccessible base of Class1'
MyApp.cxx:55:55: error: cannot allocate an object of abstract type 'Class2::Callback'
Class2.h:16:10: note: because the following virtual functions are pure within 'Class2::Callback'
Class2.h:19:18: note: virtual bool Class2::Callback::class2Method(int)
我做错了什么?
以下是Class2::Callback
中定义的Class2.h
的定义:
class Class2
{
public:
struct Callback {
virtual bool class2Method(int i) = 0;
};
}
答案 0 :(得分:3)
您在这里使用过private inheritance。 Class1
的声明应如下所示:
class Class1 : public Class2::Callback { // note the keyword "public" here
public:
//Class2::Callback method
virtual bool class2Method(int i);
};
答案 1 :(得分:1)
在c ++中,类的默认访问说明符是私有的:
class Class1 : public Class2::Callback
应该做的伎俩。那或者使它成为一个默认访问说明符是公共的结构。
答案 2 :(得分:1)
您的代码中存在两个问题:
正如许多人所指出的那样,你使用私有继承而不是公共继承 一。
转换为Class2::Callback
时使用切片:(Class2::Callback)instanceOfClass1
。要使用polimorphism,你需要一个指针或一个引用。假设您IWantAClass2Callback
有以下签名:
void IWantAClass2Callback(Class2::Callback&);
(返回类型无关紧要),正确的调用将是:
IWantAClass2Callback(instanceOfClass1);
答案 3 :(得分:0)
回调必须位于public:
的{{1}}区域,是这样吗?我的意思是:
Class2
答案 4 :(得分:0)
你真的有
IWantAClass2Callback((Class2::Callback)instanceOfClass1);
在那里?你期望它做什么?你可以转换指针和引用,但没有实例。
尝试将签名更改为
void IWantAClass2Callback(Class2::Callback &instance)
并致电
IWantAClass2Callback((Class2::Callback&)instance)