1.首先,继承过程中使用访问说明符主要是为了控制 继承下来的成员的访问性,比如对类A:
class A {
public:
int a;
protected:
int b;
private:
int c;
};
使用不同的继承方式,对应的成员访问性如下:
class B : public A {
// a -> public
// b -> protected
// c 不可见
};
class C : protected A
{
// a -> protected
// b -> protected
// c 不可见
};
class D : private A
{
// a -> private
// b -> private
// c 不可见
};
至于private 继承:在 B 类里面,this 还是可以转成 A* 的,没有破坏多态;private 继承可以使子类 B 继承父类 A 的 public、protected 成员,但又屏蔽了 B 的子类对这些成员的使用,其他用处可以参见[1]。
2. 其次,使用 virtual 说明符,主要是因为 C++ 里的零开销 Zero Overhead 原则,virtual 成员是有虚函数表开销的,而且在需要动态绑定的场景下才会用到,C++当然是默认首选没有开销的。
采用模板思路的可以参见静态绑定的 CRTP(Curiously Recurring Template Pattern)[2]。