记住下面的原则:
1) 当一个对象调用一个非虚函数时, 与对象的声明类型绑定的, 并不是与实际的对象的类型绑定的。
2)在虚函数中调用非虚函数的时候, 调用的非虚函数是与虚函数所在的类是一致的
3) 在非虚函数中调用虚函数的时候, 调用的虚函数是与对像的实际类一致的。
4) 非虚函数与虚函数的调用与其存取权限无关。
分为,非虚函数: public, protected, private
虚函数: public, protected, private
非虚函数调用非虚函数, 虚函数
虚函数调用非虚函数, 虚函数
以及他们在子类中的运行时的行为。
class BaseTemplate
{
public:
void step1(void) // 不可被更改的实现细节
{
std::cout << "Base: step1不能更改" << std::endl;
}
virtual void step2(void ) // 可以被派生类修改的实现细节
{
std::cout << "Base: step2可以更改" << std::endl;
}
protected:
virtual void step3(void ) =0; // 必须被派生类修改的实现细节
public:
void work(void) // 骨架函数,实现了骨架
{
step1() ;
step2() ;
step3() ;
}
};
class Dervie:public BaseTemplate
{
public:
void step1(void) // 不可被更改的实现细节
{
std::cout << "Derive: step1不能更改" << std::endl;
}
void step2(void ) // 可以被派生类修改的实现细节
{
std::cout << "Derive: step2可以更改" << std::endl;
}
protected:
void step3(void)
{
std::cout << "Derive: step3" << std::endl;
}
};
int main(int argc, char* argv[])
{
BaseTemplate* a = new Dervie;
a->work();
Dervie* b = new Dervie;
b->work();
system("pause");
return 0;
}