C++ 多层继承C++;

C++ 多层继承C++;,c++,inheritance,virtual,C++,Inheritance,Virtual,我有一个基本资源,它包含加载和卸载等纯虚拟函数。然后,我有一个从这个类继承的类,它是AudioResource,具有虚拟功能,比如play和stop。然后我从这个类中获得了一个名为BassAResource的类 假设我返回了一种类型的Resource*然后我想将其类型转换为AudioResource并调用load函数,让它实际所在的类来处理它,但我不断遇到问题,说它是AudioResource=s中的纯虚拟函数 class Resource { public: Resou

我有一个基本资源,它包含加载和卸载等纯虚拟函数。然后,我有一个从这个类继承的类,它是AudioResource,具有虚拟功能,比如play和stop。然后我从这个类中获得了一个名为BassAResource的类

假设我返回了一种类型的Resource*然后我想将其类型转换为AudioResource并调用load函数,让它实际所在的类来处理它,但我不断遇到问题,说它是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();

虚拟继承仅适用于指针(必须引用对象,而不是类型)。相反,将其强制转换为类型AudioResource*,并将其视为指针(或使用智能指针)。

您无法构造“AudioResource”,因为它有未定义的方法。我假设您返回的是一个已转换为资源指针的“BASSAResource”。让我用伪代码看看我是否明白你的意思

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

void myMain() {
   Resource *resource = myFunc();
   AudioResource *audio = (AudioResource*) resource;
   audio->load();
}
这应该可以很好地工作——事实上,为什么要转换为AudioResource,因为load在资源类中定义为一个抽象方法。但如果你想“玩”,就需要这个演员阵容。同样,您不能使用“new AudioResource()”进行构造,因为您有一个必须首先实现的抽象方法


另外,要非常小心地使所有析构函数都是虚拟的。您的~bassare源不是虚拟的,这将给您带来问题。

您需要更好的源代码摘录。您包含的类定义不完整(所有3个都缺少右括号和分号),并且您还没有包含任何试图调用load函数的代码。我正在这样做:AudioResource*temp=(AudioResource*)(AudioManager::getInstance()->get(“Song1.mp3”);get函数返回资源类型,然后我将cast类型转换为AudioResource我不确定这是否是您的意思?您得到错误的那一行是什么?因为这看起来像是一条有效的线。在一个类上没有虚拟析构函数没有固有的问题,并且建议某人应该总是有一个,而不解释它什么时候重要是没有用的。虚拟析构函数只有在类(或将来的某个子类)将在析构函数中执行重要工作时才有用,即使派生类是被析构函数时也需要执行这些工作。通常是这样,但并不总是这样。总是将析构函数声明为虚拟的。如果您不这样做,他们的行为将不会如预期的那样。这会导致静默内存泄漏和清理问题。没有正当理由不这样做。@AndrewKhosravian:当您通过基类指针删除对象时,需要使用虚拟析构函数(例如,
Base*Base=new-Derived;delete-Base;
。但是,在继承方案中,强制转换到基类指针是非常常见的,如果您有一个虚拟方法,您可能还应该定义一个虚拟析构函数。@Kieveli:显然有理由不定义虚拟析构函数,否则这将不是一个选项(或者至少是默认行为)。不添加虚拟析构函数的一个关键原因是定义一个POD类型。请注意,许多标准库类型都没有虚拟析构函数,包括
std::string
std::vector
和其他容器。感谢您的措辞,它比我制作的André更清晰。