一、整体代码
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: 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的方法