Abstract base class puzzle
在课堂设计中,我遇到了以下问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | class MyData { int foo; }; class AbstraktA { public: virtual void A() = 0; }; class AbstraktB : public AbstraktA { public: virtual void B() = 0; }; template<class T> class ImplA : public AbstraktA { public: void A(){ cout <<"ImplA A()"; } }; class ImplB : public ImplA<MyData>, public AbstraktB { public: void B(){ cout <<"ImplB B()"; } }; void TestAbstrakt() { AbstraktB *b = (AbstraktB *) new ImplB; b->A(); b->B(); }; |
上述代码的问题是编译器会抱怨Abstrakta::a()未定义。
接口A由多个对象共享。但是,的实现依赖于模板参数。界面B是外界看到的,需要Abstrakt。
我希望这样做的原因是它允许我这样定义对象C:定义从Abstrakt A继承的接口C。使用模板A的不同数据类型定义C的实现。
我希望我明白。有什么方法可以做到这一点,还是我需要重新考虑我的设计?
您有两条从Abstrackta继承的路径,您只在其中一条中实现Abstrakta::a(),因此编译器会抱怨。
在这两种情况下,您可能希望实际上从Abstrakta继承,以便只有一个Abstrakta基对象(在Abstrakta之前添加
我忘了向基类添加虚拟析构函数。我相信这会导致运行时malloc错误。
1 2 3 4 | AbstraktB *b = new ImplB; b->A(); b->B(); delete b; |
在调试模式下,在delete语句中,gcc给出了:malloc:***对象0x60e2c4的错误:未分配释放的指针
我通过将基类更改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class AbstraktA { public: virtual ~AbstraktA(){}; virtual void A() = 0; }; class AbstraktB : virtual public AbstraktA { public: virtual ~AbstraktB(){}; virtual void B() = 0; }; |