从父类访问子类

时间:2014-07-06 10:03:59

标签: c++ class inheritance

首先,如果已经提出这个问题,我很抱歉,但我无法找到答案。

那么,我可以拥有A类并且它继承了B类,我可以从B类访问A类函数吗?

这只是一个例子。

class A : public B
{
    void aFoo() { cout << "A" << endl; }
};

class B
{
    void bFoo() { aFoo(); }
};

那么,这有可能以任何方式实现吗?如果可以做到的话?

5 个答案:

答案 0 :(得分:1)

您可以在B中使用虚拟函数并在A中重新实现它,但是您仍然必须将对象创建为A,例如:

class A : public B {
    void aFoo() { cout << "A" << endl; }
};

class B {
    void bFoo() { aFoo(); }
    virtual void aFoo() { cout << "B" << endl; } //or
    virtual void aFoo() = 0; // turning B into an abstract class.
};
.......
B* ab = new A;

答案 1 :(得分:1)

是(使用模板)...您可以使用Parent类作为模板类来接收其子类型,因此它可以将自身转换为该类型...例如:

template <typename T>
class A
{
public:
    A() = default;

    void afoo()
    {
        reinterpret_cast<T*>(this)->bfoo();
    }
};


class B : public A<B>
{
public:
    B() = default;

    void bfoo()
    {
        std::cout << "In B::bfoo()";
    };
};


int main()
{

    B b;
    b.afoo();
}

这样可以避免虚拟继承。

答案 2 :(得分:0)

  

那么,这有可能以任何方式进行,如果可以做到的话?

即可。你不能。 请注意,继承不起作用。基类及其对象对从基类派生的任何类都不了解。

答案 3 :(得分:0)

没有。如果声明为public / protected,派生类可以访问基类成员和方法。它确实以相反的方式工作。

答案 4 :(得分:0)

如果你的问题是关于它是否可能在语法上,那么正如其他人已经回答的那样 - 不,你不能,因为这不是它的工作方式。

但是,如果您正在寻找一种设计模式来解决您希望拥有的问题,那么我认为您所寻找的是 Bridge Pattern 其中class调用一个虚函数,该函数在每个不同的子类中实现不同(正是OneofOne所回答的)。

有关桥梁模式的更多信息:http://sourcemaking.com/design_patterns/bridge/cpp/1