首页 > 解决方案 > C++中无继承的“CLASS C”访问“CLASS A”函数

问题描述

这是 UML 的样子CLASS UML

ClassA 有一个指向 ClassB 的指针,而 ClassB 有一个指向 ClassC 的指针。我想知道是否可以在不继承 ClassA 的情况下访问 ClassC 中 ClassA 的函数。

标签: c++visual-studio

解决方案


问:我想知道我是否可以在不继承 ClassA 的情况下在 ClassC 中访问 ClassA 的函数。

A:是的,可以在 ClassC 中访问 ClassA 的功能。通过调用 classA 的静态成员函数或通过向 ClassC 提供 classA 的特定实例。看起来可以通过反向跟踪指针(ClassC 到 ClassB 到 ClassA)来访问 classA,但这是不可能的。指针仅指向一个方向的值。

这是一个关于类和类(对象)实例之间差异的有趣问题。下面的例子说明了为什么没有 classA::callAnyMethod():

#include <iostream>

class B;
class C;

class A
{
    public:
        A(B *next, int value) : next_(next), value_(value) { }
        void af1() const { std::cout << value_ << "\n"; }
        static void af2() { std::cout << staticValue << "\n"; }

    protected:
        B *next_;
        int value_;
        static int staticValue;
};

int A::staticValue = 3;

class B
{
    public:
        B(C *next) : next_(next) { }

    protected:
        C *next_;
};

class C
{
    public:
        void cf1(const A &a) { a.af1(); }
        void cf2() { A::af2(); }
};

int main()
{
    C c;

    B b(&c);

    A a1(&b, 1);
    A a2(&b, 2);

    // a1 is first instance of class A.
    // One 'A::value_' is defined in a1 and is equal to 1.
    c.cf1(a1);

    // a2 is second instance of class A.
    // Second 'A::value_' is defined in a2 and is equal to 2.
    c.cf1(a2);

    // Without specific instance of class A, we can use only static member
    // 'A::staticValue' which is defined at file scope and is equal to 3.
    // 'A::staticValue' is not part of objects (instances) of class A.
    c.cf2();

    return 0;
}

推荐阅读