Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 抽象基类难题_C++_Templates_Virtual_Abstract Class_Multiple Inheritance - Fatal编程技术网

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,如果这不是你想要的,那么这是值得关注的。在这种情况下,这就是你想要的。(我认为这个警告属于“不太常见,误报比真多,很难通过在误报情况下重新组织代码来避免干净的误报”)