C++ 将抽象类实现为本地类?利弊

C++ 将抽象类实现为本地类?利弊,c++,class,local,C++,Class,Local,出于某种原因,我正在考虑将某个函数(方法)中的接口实现为本地类 考虑以下几点: class A{ public: virtual void MethodToOverride() = 0; }; A * GetPtrToAImplementation(){ class B : public A { public: B(){} ~B(){} void MethodToOverride() { /

出于某种原因,我正在考虑将某个函数(方法)中的接口实现为本地类

考虑以下几点:

class A{
public:

    virtual void MethodToOverride() = 0;

};

A * GetPtrToAImplementation(){

    class B : public A {
    public:
        B(){}
        ~B(){}

        void MethodToOverride() {
            //do something
        }
    };

    return static_cast<A *>(new B());
}


int _tmain(int argc, _TCHAR* argv[])
{

    A * aInst = GetPtrToAImplementation();

    aInst->MethodToOverride();

    delete aInst;
    return 0;
}
A类{
公众:
虚空方法ToOverride()=0;
};
A*GetPtrToAImplementation(){
B类:公共A{
公众:
B(){}
~B(){}
void MethodToOverride(){
//做点什么
}
};
返回静态_cast(新的B());
}
int _tmain(int argc,_TCHAR*argv[]
{
A*aInst=GetPtrToAImplementation();
aInst->MethodToOverride();
删除aInst;
返回0;
}
我这样做的原因是:

  • 我懒得在单独的文件中实现类(B)
  • MethodToOverride仅代表调用其他类
  • 其他用户不应看到B类
  • 无需担心删除aInst,因为在实际实现中使用了智能指针
  • 所以我的问题是我是否做对了

    提前谢谢

  • 您可以在实现
    GetPtrToAImplementation()
    的实现文件的未命名命名空间中定义
    B

  • A
    应具有虚拟dtor

  • >P>由当前C++标准,不能使用局部类作为模板参数。(例如,这意味着您不能将它们与STL一起使用。)


    为什么您不能在
    A
    的实现文件中完全(非本地)定义
    B
    ?这只是一个小错误,但A应该有一个虚拟析构函数。它只是一个接口,在头文件中声明。此外,B在定义了GetPtrToAiImplementation的翻译单元之外也看不到。@sbi:看来我该休息一下了,因为我记不起未命名的名称空间:)p.s.感谢您提供的信息,因为我不知道它们不能用作模板参数!