Многоуровневое наследование C ++ - PullRequest
3 голосов
/ 04 марта 2012

У меня есть базовый ресурс, который содержит чисто виртуальные функции, такие как загрузка и выгрузка. Затем у меня есть класс, унаследованный от этого класса, и я являюсь AudioResource и имею виртуальные функции, такие как воспроизведение и остановка. Мне тогда присущ этот класс и есть класс BassAResource.

Давайте представим, что я возвратил тип типа Resource *, затем я хочу напечатать приведение его к AudioResource и вызвать функции загрузки, и позволить классу, который на самом деле это обрабатывает, но я продолжаю получать проблемы, говоря, что это чистый виртуальная функция в AudioResource = s

class Resource
{
    public:
        Resource();
        Resource(std::string filename,unsigned int scope, RESOURCE_TYPE type);
        virtual ~Resource();
        virtual void load() = 0;
        virtual void unload() = 0;


class AudioResource : public Resource
{
    public:
        AudioResource(std::string filename, unsigned int scope, RESOURCE_TYPE type, AUDIO_T Atype);
        virtual void load() = 0;
        virtual void unload() = 0;
        virtual void play() = 0;
        virtual void pause() = 0;
        virtual void stop() = 0;

class BASSAResource : public AudioResource
{
    public:
        ~BASSAResource();
        virtual void load();
        virtual void unload();
        virtual void play();
        virtual void pause();
        virtual void stop();

Ответы [ 2 ]

1 голос
/ 04 марта 2012

Вы не можете создать 'AudioResource', так как он имеет неопределенные методы.Я предполагаю, что вы возвращаете 'BASSAResource', который был приведен к указателю ресурса.Позвольте мне псевдокод, чтобы увидеть, если я понимаю ваше значение

Resource *myFunc() {
   BASSAResource *resource = new BASSAResource();
   return (Resource*)resource;
}

void myMain() {
   Resource *resource = myFunc();
   AudioResource *audio = (AudioResource*) resource;
   audio->load();
}

Это должно работать нормально - на самом деле, почему приведение к AudioResource, так как load определяется как абстрактный метод в вашем классе Resource.Но если вы хотите «сыграть», этот бросок будет обязательным.Опять же, вы не можете создавать с использованием 'new AudioResource ()' из-за того, что у вас есть абстрактный метод, который необходимо сначала реализовать.

Кроме того, будьте очень осторожны, чтобы все деструкторы были виртуальными.Ваш ~ BASSAResource не является виртуальным, и это вызовет у вас проблемы.

1 голос
/ 04 марта 2012

Виртуальное наследование работает только с указателями (вы должны ссылаться на объект, а не на тип).Вместо этого приведите его к типу AudioResource * и обработайте его как указатель (или используйте умный указатель).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...