Путаница в расширении абстрактных классов в C ++ - PullRequest
0 голосов
/ 18 января 2012

В моем заголовочном файле для 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 ]

3 голосов
/ 18 января 2012

Вы использовали личное наследование здесь. Объявление Class1 должно выглядеть так:

class Class1 : public Class2::Callback { // note the keyword "public" here
public:
    //Class2::Callback method
    virtual bool class2Method(int i);
};
1 голос
/ 18 января 2012

В вашем коде есть две проблемы:

  1. Как отмечали многие, вы использовали частное наследование вместо публичного.

  2. Вы используете нарезку при преобразовании в Class2::Callback: (Class2::Callback)instanceOfClass1.Чтобы использовать полиморфизм, вам нужен указатель или ссылка.Предполагая, что у вас IWantAClass2Callback имеется следующая подпись:

    void IWantAClass2Callback(Class2::Callback&);

    (тип возврата не имеет значения), правильный вызов будет:

    IWantAClass2Callback(instanceOfClass1);

1 голос
/ 18 января 2012

В c ++ спецификатор доступа по умолчанию для классов является приватным:

 class Class1 : public Class2::Callback

Должен сделать свое дело. Это или сделать его структурой, чей спецификатор доступа по умолчанию является общедоступным.

0 голосов
/ 18 января 2012

У вас действительно есть

IWantAClass2Callback((Class2::Callback)instanceOfClass1);

там? что вы ожидаете от этого? вы можете разыгрывать указатели и ссылки, но не экземпляры.

попробуйте изменить подпись на

void IWantAClass2Callback(Class2::Callback &instance)

и звонит

IWantAClass2Callback((Class2::Callback&)instance)
0 голосов
/ 18 января 2012

Обратный вызов должен находиться в public: области Class2, так ли это? Я имею в виду:

class Class2 {
public:
     class Callback {
         virtual bool class2Method(int) = 0
     };
};
...