一、整体代码
01.cpp
#include <iostream>
using namespace std;
class Base {
public:
virtual void display() { //虚函数,virtual声明的函数,向上转型后的对象才能调用到子类同名的方法
cout << "Base" << endl;
}
Base() {
cout << "Base ..." << endl;
}
virtual ~Base() { //虚析构函数,只有声明成virtual,向上转型的对象先调用子类的析构函数,再调用父类的析构函数
cout << "~Base ..." << endl;
}
protected:
void run(){
cout << "run" << endl;
}
};
class Derived: public Base {
public:
virtual void display() { //覆盖父类的方法
cout << "Derived" << endl;
Base::display(); //使用父类的方法,由于是覆盖,所以同名,要用这种方式来引用
}
void test() { //定义自己的方法
run();//使用父类的public或者protected方法
}
Derived()
{
cout<<"Derived ..."<<endl;
}
~Derived()
{
cout<<"~Derived ..."<<endl;
}
};
int main(void) {
Base* d = new Derived;
d->display();
delete d;
return 0;
}
二、运行结果
Base ...
Derived ...
Derived
Base
~Derived ...
~Base ...
三、
直接生成子类对象,可以调用子类的public方法和父类public非virtual的方法
直接生成父类对象,只能调用父类public方法
生成子类对象向上转型为父类对象,能够调用父类public非virtual的方法和子类覆盖virtual的方法
如果子类覆盖父类的virtual方法,加不加virtual都行,加上起到了标识作用,表示它覆盖了父类的virtual方法。
如果子类还有它的子类,那么这个virtual关键字不能省去。
四、重点:
父类方法只有声明为virtual,生成子类对象向上转型为父类对象时,才能调用子类覆盖父类的同名函数。
private:本类中调用。
protected:本类和子类中调用。
public:本类和子类中调用+生成对象后供外部调用。