类定义方式一般有两种
Base b和Base b(3);一种不带参数,一种带参数,这两种实例定义会在范围结束自动释放。
Base *c = new Base;和Base *c = new Base(5);没有参数可不加括号。通过new申请的类,需要手动delete释放,否则需要关闭程序才会释放(说的内存泄漏是指程序一直运行期间不断产生新的分配内存未删除)。
继承
- 继承父类,父爷类带有virtual修饰的函数,子类可选加virtual修饰 自动算虚函数。
- 子类继承父类,父类继承爷类,子类初始化时,先调用爷类构造,父类构造,自身构造顺序。析构则相反,先析构自身的,再回溯析构父类的。
- 父类包含的函数,爷类不包含,子类则不能用爷类去引用,如dd pd; Base a=ⅆ错误。
- 带纯虚函数的父类则是抽象类virtual void f()=0,父类不可实例化,其子类必须对函数实现。
#include <iostream> class Base { public: Base(){ std::cout << "this Base init" << std::endl; } Base(int i) { std::cout << "Base init cout " << i << std::endl; } void print() { std::cout << "Base::print()" << std::endl; } virtual void virprint() { std::cout << "Base::virprint()" << std::endl; } }; class Derived : public Base { public: Derived(); void print() { std::cout << "Derived::print()" << std::endl; } void virprint() { std::cout << "Derived::virprint()" << std::endl; } void cpr() { std::cout << "Derived::cpr()" << std::endl; } }; class dd :public Derived { public: void virprint() { std::cout << "dd::virprint()" << std::endl; } void cpr() { std::cout << "dd::cpr()" << std::endl; } }; Derived::Derived() { std::cout << "this Derived init" << std::endl; } int main() { Base b(3);//会自动释放 std::cout << "after this b " << std::endl; Base *c=new Base;//需要手动释放 std::cout << "after this c " << std::endl; Base *c1; std::cout << "after this c1 " << std::endl; Derived d; dd pd; c = &b; Base* ptr = &b; // 指向基类对象 ptr->print(); // 调用基类版本 ptr->virprint(); ptr = &d; // 指向派生类对象 ptr->print(); // 调用派生类版本 ptr->virprint(); Derived* ppte = &pd; ppte->print(); ppte->virprint(); ppte->cpr(); delete c; return 0; }
打印: