对在C ++中扩展抽象类的困惑

时间:2012-01-18 12:46:11

标签: c++ abstract-class

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;
  };
}

5 个答案:

答案 0 :(得分:3)

您在这里使用过private inheritanceClass1的声明应如下所示:

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)

您的代码中存在两个问题:

  1. 正如许多人所指出的那样,你使用私有继承而不是公共继承 一。

  2. 转换为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)