C++定义,继承和虚函数

类定义方式一般有两种

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;
}

打印:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章