Viv*_*oel 7 c++ inheritance design-patterns
我有一组像这样的类:
class A {
public:
int DoIt() {
//common code
}
};
class B : public A {
int DoIt() {
if (A::DoIt() == 1) {
return 1;
}
else {
// do b specific code
}
}
};
class C : public A {
int DoIt() {
if(A::DoIt()==1) {
return 1;
}
else {
// do c specific code
}
}
};
Run Code Online (Sandbox Code Playgroud)
有没有办法可以避免手动输入此代码:
if (A::Doit() == 1) { return 1; } else {
Run Code Online (Sandbox Code Playgroud)
在每一个派生自A的班级?
只需将特定代码分离到另一个方法虚拟方法即可.
class A
{
public:
int DoIt() /*final*/
{
// common code
if (return_value == 1)
return 1;
else
return DoIt_specific();
}
private:
virtual int DoIt_specific() = 0;
// ^ or some "A"-specific actions if A cannot be abstract.
};
class B : public A
{
virtual int DoIt_specific() /*override*/
{
// specific code for B
}
};
Run Code Online (Sandbox Code Playgroud)
这被称为非虚拟接口习语.