在我的班级设计中遇到了以下问题:
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由多个对象共享。但是A的实现取决于模板参数。界面B是外界所看到的,需要abstrakt。
我希望这样的原因是它允许我像这样定义对象C: 定义继承自abstrakt A的接口C. 使用模板A的不同数据类型定义C的实现。
我希望我很清楚。有没有办法做到这一点,还是我需要重新考虑我的设计?
答案 0 :(得分:9)
你有两个AbstracktA继承路径,你只在其中一个中实现AbstraktA :: A(),所以编译器会抱怨。
你可能想要在两种情况下从AbstraktA虚拟继承,这样只有一个AbstraktA基础对象(在AbstraktA之前添加virtual
)。
答案 1 :(得分:0)
我忘了在基类中添加虚拟析构函数。这导致了我认为的运行时malloc错误。
AbstraktB *b = new ImplB;
b->A();
b->B();
delete b;
在调试模式下,在delete语句中,GCC给了我: malloc:***对象0x60e2c4的错误:释放的指针未分配
我通过将基类更改为:
来解决这个问题class AbstraktA
{
public:
virtual ~AbstraktA(){};
virtual void A() = 0;
};
class AbstraktB : virtual public AbstraktA
{
public:
virtual ~AbstraktB(){};
virtual void B() = 0;
};