首先,如果已经提出这个问题,我很抱歉,但我无法找到答案。
那么,我可以拥有A类并且它继承了B类,我可以从B类访问A类函数吗?
这只是一个例子。
class A : public B
{
void aFoo() { cout << "A" << endl; }
};
class B
{
void bFoo() { aFoo(); }
};
那么,这有可能以任何方式实现吗?如果可以做到的话?
答案 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