指向抽象类的指针

时间:2014-01-30 18:35:07

标签: c++ inheritance abstract-class

我有三节课。 A,B和C.

B类是一个抽象类。

A类需要调用B类函数。

C类派生自B类,还需要持有指向A类的指针来调用A类函数。

要求1:

需要指向B的指针。我知道这可以通过“B是一个抽象类来实现,它不可能创建它的实例。因此我在A中创建一个C实例并用它来调用B的函数“但是在创建C的实例时遇到问题。

要求2:

C类需要一个指向A类的指针来调用它的函数。我如何实现这一目标?

//A.h

class A
{
public:
    void fun1();
    void fun2();
private:
    // creating ptr to C because B is an abstract class
    C *m_ptrC;
};

//A.cpp

void A::fun1()
{
    m_ptrC->fun4();
}
void A::fun2()
{
    //some code
}



//B.h
class B
{
public:
    //pure virtual function
    void fun3() = 0;
    void fun4();
};


//B.cpp

void B::fun4()
    {
            //pure virtual hence C::fun3() gets called
        fun3();
    }



//C.h
class C:public B
{
public:
    //Overridden from B
    void fun3();

private:
    //Ptr to class A, to call fun
    A *ptrA;
};

//C.cpp
//Overridden from B
void C::fun3()
{
    ptrA->fun2();
}

ptrC和ptrA应该如何初始化? 此外,我不确定前向声明和文件包含重定义/不完整类型错误的结果。

1 个答案:

答案 0 :(得分:1)

如果没有显示问题的实际代码,我认为这就是:

1 :你在A.h和C.h中包括C.h。这称为循环依赖。要避免这些,您需要使用前向声明。你基本上声明了这个类,并且只在cpp文件中包含它的标题实际使用它。所以在A.h例如你可以:

class C;

class A
{

void fun1();

private:

C *ptrC = new C; 
};

然后在A.cpp中你可以包括C.h。

可能缺少其他问题,包括标题中的警卫。


2 :将A的实例(作为ref或指针)传递给C构造函数。此处也使用前向声明。对物体的使用寿命要谨慎。

具有这样的循环依赖性通常比值得更麻烦。尝试为A设置一个接口(这样你可以将它传递给C而不在C的翻译单元中包含A.h)或者使用绑定到A实例的仿函数。


3 :如果你没有使用多态,我真的不明白为什么你有一个C的接口,但可能是由于缺乏真正的代码。