3.1 private 的虚函数
考虑下面的例子:
class A
{
public:
void foo() { bar();}
private:
virtual void bar() { ...}
};
class B: public A
{
private:
virtual void bar() { ...}
};
在这个例子中,虽然 bar()在 A 类中是 private 的,但是仍然可以出现在派生类中,并仍然可以与 public
或者 protected 的虚函数一样产生多态的效果。并不会因为它是 private 的,就发生 A::foo()不能访问 B::bar()
的情况,也不会发生 B::bar()对 A::bar()的 override 不起作用的情况。
这种写法的语意是:A 告诉 B,你最好 override 我的 bar()函数,但是你不要管它如何使用,也不要自
己调用这个函数。
3.2 构造函数和析构函数中的虚函数调用
一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。
也就是说不能在构造函数和析构函数中让自己“多态”。例如:
class A
{
public:
A() { foo();} // 在这里,无论如何都是 A::foo()被调用!
~A() { foo();} // 同上
virtual void foo();
};
class B: public A
{
public:
virtual void foo();
};
void bar()
{
A * a = new B;
delete a;
}
评论0