指向抽象类的指针

Posted

技术标签:

【中文标题】指向抽象类的指针【英文标题】:Pointer to abstract class 【发布时间】:2014-01-30 18:35:06 【问题描述】:

我有三门课。 A、B 和 C。

B 类是一个抽象类。

A类需要调用B类的函数

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

要求一:

A 需要指向 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 应该如何初始化? 另外我不确定前向声明和文件包含导致重新定义/不完整类型错误。

【问题讨论】:

添加一些演示问题的代码。 从您的陈述中不清楚您有什么或没有什么。你有一个从 B 派生并实现功能的类吗? 我认为 OP 存在循环依赖问题。前向声明可能会有所帮助。 @Jarod42 这也是我的想法,我只是在等待发布我的答案;) 它们都在同一个文件中吗? 【参考方案1】:

如果没有显示问题的实际代码,我认为会发生以下情况:

1:您在 A.h 中包含 C.h,在 A.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 接口,但这可能是因为缺少真正的代码。

【讨论】:

以上是关于指向抽象类的指针的主要内容,如果未能解决你的问题,请参考以下文章

抽象类指针

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?

指向抽象基类的指针需要一些转换吗? C++

关于C++基类、派生类的引用和指针

如何使用抽象类型的 C++ 指针指向具体类?

接口和抽象类的区别