我有一个包含纯虚拟功能(如加载和卸载)的基本资源。然后,我从该类继承一个类,成为AudioResource,又具有虚拟功能,例如播放和停止。然后,我从该类继承而来,并拥有一个名为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”,因为它具有未定义的方法。我假设您返回的是已强制转换为Resource指针的“BASSAResource”。让我用伪代码看看我是否明白你的意思

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

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

这应该可以正常工作-实际上,由于负载在Resource类中定义为抽象方法,因此为什么要强制转换为AudioResource。但是,如果您想“玩”,则需要此 Actor 表。同样,由于您具有必须首先实现的抽象方法,因此无法使用“new AudioResource()”进行构造。

同样,要非常小心,以使所有析构函数都是虚拟的。您的〜BASSAResource不是虚拟的,这将为您带来问题。

09-08 11:37