C++继承的最佳实践

4
如果我想使用继承来避免重复下面的common_method方法。
int A::different_method()
{ return 1; }

int A::common_method()
{ return this->different_method()+1; }

int B::different_method()
{ return 2; }

int B::common_method()
{ return this->different_method()+1; }

最佳方法是什么?

一种方式是使AB从一个基类C继承,使用新的方法:

int A::different_method()
{ return 1; }

int B::different_method()
{ return 2; }

int C::different_method()
{ return 0; }

int C::common_method()
{ return this->different_method()+1; }

但是有点烦人的是我不得不定义无用的C::different_method。在这种情况下,最佳实践是什么?


不太确定你在问什么,但是你可以查看http://coliru.stacked-crooked.com/a/54c71d7ddaa147fe。 - sp2danny
2
继承的目的并不是为了避免函数的重复。其目的在于以逻辑方式关联对象类型(例如,公共继承可以表示“is-a”关系,如“拉布拉多是一只狗”,而私有继承可以表示“基于实现”的关系,如“小部件被实现为图形组件”)。这样做可以作为一个结果减少代码的重复。但是,以减少重复为目标往往会导致对象之间奇怪的联系。 - Peter
4个回答

3

尝试使用 纯虚函数(pure virtual function)

struct Base {
    virtual int different_method() = 0;

    int common_method() {
        return different_method() + 1;
    } 
};

struct Derived1 : Base {
    int different_method() override {
        return 1;
    }
};

struct Derived2 : Base {
    int different_method() override {
        return 2;
    }
};

来看看live


2
建议使用 override 而不是 virtual 来指示重写的方法。这样编译器可以帮助检测到可能出现的“拼写错误”。 - Jarod42
@Jarod42 谢谢。我很感激你的建议。我会更新我的答案。 - NutCracker

2
一种方法是让A和B继承一个基类C,
是的,你需要一个基类。
class C {
public:
  virtual ~C() { }

  virtual int different_method() = 0;

  virtual int C::common_method() { 
     return this->different_method()+1; 
  }

}

class A: public C {
   // Implement 
   int different_method() override;
};

class B: public C {
   int different_method() override;
};

1
如果您只需要使用类A和B,则可以将C类声明为抽象类并仅实现common_method()different_method()可以在C类的头文件中声明为纯虚函数,方法如下:
virtual different_method()=0

我为你留下一个有用的链接,讲解 纯虚函数和抽象类 相关的内容。


0
你真的被 A a; a.common_method() 语法所束缚吗?
为什么不考虑
template <typename T>
int common_free_function(T& t) {
    return t.different_method() + 1;
}

A a;
B b;
common_free_function(a);
common_free_function(b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接