三规则和继承

Jak*_* M. 4 c++ inheritance

class A定义复制运算符,析构函数和运算符=.(三条规则)

如果B继承自A:

  • 析构函数将自动调用
  • 我需要链接构造函数
  • operator=......我应该为班级明确定义它B吗?

Mat*_* M. 6

不,这是不必要的.

如果你仔细阅读"三法则",你会注意到关于基类没有任何说法,只能根据类的适当属性和行为做出决定.

(在ideone上查看此示例)

#include <iostream>

struct A {
  A(): a(0) {}
  A& operator=(A const& rhs) { a = rhs.a; return *this; }
  int a;
};

struct B: A { B(): b(0) {} int b; };

int main() {
  B foo;
  foo.a = 1;
  foo.b = 2;

  B bar;
  bar = foo;

  std::cout << bar.a << " " << bar.b << "\n";
}

// Output: 1 2
Run Code Online (Sandbox Code Playgroud)

这实际上是封装的真正力量.因为使用Rule of 3成功,在使基类的行为变得健全时,其派生类不需要知道复制构造函数是由编译器默认还是手动实现(并且复杂),这对用户来说都很重要(并且派生类是用户),是复制构造函数执行复制.

三规则提醒的美国实现细节,以帮助实现正确的语义.与所有实现细节一样,它仅对此类的实现者和维护者有用.