因此假设有一个带有函数foo的A类
A类是几个具有函数foo的类的父类
所有子类都需要其功能
A::foo
并加上它
例如:
class A
{
public:
void foo()
{
print('A');
}
};
class B:public A
{
public:
void foo()
{
print("B");
}
};
class C:public A
{
public:
void foo()
{
print("C");
}
};
void main()
{
B b;
C c;
c.foo()// now only goes to C::foo(), meaning print C. I want it to to also go into A::foo() meaning print AC
b.foo()//now only goes to B::foo(),meaning print B. want it to print AB
}
如果我想添加class D : A
foo函数,它还会A::foo()
然后D::foo()
对不起,如果我遗漏了一些明显的东西。
编辑:因为不清楚问题是,是否有自动方式这样做。
编辑:找到了解决方法:
class A
{
virtual void foo2(){}
public:
void foo()
{
print('A');
foo2();
}
};
class B:public A
{
void foo2()
{
print("B");
}
public:
};
class C:public A
{
void foo2()
{
print("C");
}
public:
};
void main()
{
B b;
C c;
c.foo()// now prints AC
b.foo()//now prints AB
}
似乎是多余的,因为现在有2个函数。
答案 0 :(得分:3)
您可以使用A::foo()
调用父类的函数实现。
在您的情况下,只需添加该函数调用即可获得您想要的结果:
class B:public A
{
public:
void foo()
{
A::foo();
print("B");
}
};
作为旁注,每当您打算覆盖函数时,都应将其声明为virtual
:
class A
{
public:
virtual void foo()
{
print('A');
}
};
然后在覆盖它时,请使用override
关键字:
class B:public A
{
public:
void foo() override
{
print("B");
}
};
答案 1 :(得分:0)
你所谓的解决方法是这个问题的既定解决方案,虽然有些人可能会称之为解决方法但很多人不会。
它甚至有一个涵盖它的名字。非虚拟接口模式。
草药口香糖: - http://www.gotw.ca/publications/mill18.htmS.O.的一个例子,可能还有更多: - Non-virtual interface design pattern in C#/C++
我认为这是一种自动完成的方法。
至于你的冗余,因为它有2个功能 - 以前有2个(基本版本和派生版本)。
这种方法在某些设计中的一个好处是,如果虚拟方法foo2是纯虚拟的(这会使A成为抽象),那么这会强制所有直接派生类实现foo2。 (我说立即因为如果B派生自A它必须实现foo2但是如果C然后从B C派生而不是强制实现foo2,则它可以访问B :: foo2)