似乎最好将虚拟方法设为私有,以便将以下两个客户端的接口分开 - 1. 实例化对象并调用方法的客户端 2. 从类派生并可能想要覆盖该方法的客户端。简单地说——第一个客户端不需要知道一个方法是否是虚拟的。他将调用基类公共非虚拟方法,而后者又将调用私有虚拟方法。例如,请参见下面的代码。
现在,在虚拟方法需要对其基类的相应虚拟方法进行超级消息传递的情况下,例如 Save 方法 - 它必须通过继承链中的所有虚拟方法才能保存对应于每个级别的数据派生——我们别无选择,只能使用受保护的虚拟方法——除非有一种方法可以保证在不使用超级消息传递的情况下在所有派生级别保存数据(我不知道)。
我想知道上述推理是否正确。
确保使用滚动条查看整个代码。
#include <iostream>
using namespace std;
class A {
string data;
protected:
virtual void SaveData()= 0;
public:
A():data("Data of A"){}
void Save(){
cout << data << endl;
SaveData();
}
};
class B : public A {
string data;
protected:
virtual void SaveData() { cout << data << endl;}
public:
B():data("Data of B") {}
};
class C : public B {
string data;
protected:
virtual void SaveData() {
B::SaveData();
cout << data << endl;
}
public:
C():data("Data of C") {}
};
int main(int argc, const char * argv[])
{
C c;
c.Save();
return 0;
}