C++ 抽象基类难题
在我的课堂设计中,我遇到了以下问题:C++ 抽象基类难题,c++,templates,virtual,abstract-class,multiple-inheritance,C++,Templates,Virtual,Abstract Class,Multiple Inheritance,在我的课堂设计中,我遇到了以下问题: 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:
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();
};
类MyData
{
int foo;
};
AbstraktA类
{
公众:
虚空A()=0;
};
类别AbstraktB:公共AbstraktA
{
公众:
虚空B()=0;
};
模板
ImplA类:公共AbstraktA
{
公众:
void A(){cout B();
};
上面代码的问题是编译器会抱怨AbstraktA::A()未定义
接口A由多个对象共享。但是接口A的实现依赖于模板参数。接口B是外部世界看到的,并且需要是abstrakt
我这样做的原因是它允许我这样定义对象C:
定义从abstrakt A继承的接口C。
使用模板a的不同数据类型定义C的实现
我希望我说得很清楚。有什么方法可以做到这一点,或者我需要重新考虑我的设计吗?您有两条从AbstraktA继承的路径,您只在其中一条路径中实现AbstraktA::A(),因此编译器抱怨
在这两种情况下,您可能都希望从AbstraktA虚拟继承,以便只有一个AbstraktA基对象(在AbstraktA之前添加
virtual
。我忘记了向基类添加虚拟析构函数。我相信这会导致运行时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;
};
我可能很笨,但为什么“抽象”拼写为“abstrakt”.这是故意的吗?呵呵,完全没有理由。这只是我母语的结果:)可能的重复:一个借口moi,显然是我的第一篇帖子:)谢谢你!!就这样。多简单的解决方法:)我现在记得我以前读过关于虚拟继承的书,但因为我从未在实践中使用过它,所以我完全忘记了它。我担心我不得不重新开始考虑一下我的设计,因为我无法想出一个替代解决方案来很好地解决这个问题。再次感谢。这是可行的,但会导致编译器发出警告:“警告C4250:'ImplB':通过支配继承'ImplA::ImplA::a'”这是值得关注的吗?@lalithv,如果这不是你想要的,那么这是值得关注的。在这种情况下,这就是你想要的。(我认为这个警告属于“不太常见,误报比真多,很难通过在误报情况下重新组织代码来避免干净的误报”)