C++构造和析构以及虚函数应用

#include <iostream>
using namespace std;
class A
{
public:
    A()//构造函数不能申明为虚函数,不然会报错
    {
        cout<<"构造函数A"<<endl;
    }
     ~A()  //析构函数应该定义成虚函数,如果不定义成虚函数则会造成内存泄露
    {
        cout<<"析构A"<<endl;
    }

    virtual void DoSomething()
    {
        cout<<"A is doing something"<<endl;
    }

};
class B:public A
{
public:

    B()
    {
        cout<<"构造函数B"<<endl;
    }
    ~B()
    {
        cout<<"析构B"<<endl;
    };

    void DoSomething()
    {
        cout<<"Do something in class B"<<endl;
    }
};
int main(int argc, const char * argv[])
{

    B *b = new B;
    b->A::DoSomething();//C++覆盖了以后,子类要访问父类的方法,C++是否这种发放访问,C#使用base,OC和java是用super
    //结果:构造A/构造B/A is doing something

    A *a = new B;
    a->DoSomething();//如果A中这个方法定义为虚函数,那么就会调用B中的方法
    delete a;
    //如果A中DoSomething定义为不是函数,结果:构造函数A/构造函数B/A is doing something/析构A
    //注意:如果A析构函数不定义成虚函数,这种情况下他就会不析构b

    A *b = new B; //虚函数看指向,不是虚函数看前面的类型
    b->DoSomething(); //如果A的DoSomething定义成虚函数的话那么就看后面的指向,如果A中的DoSomething不是虚函数的话那么就会看指针前面的类型,就访问A的方法。附加:只能用子类赋给父类,不能反过来
    delete b;//这里就释放对象,调用析构函数
    //结果:构造A/构造B/A is doing something/析构B/析构A

    return 0;
}
时间: 2024-11-04 17:16:38

C++构造和析构以及虚函数应用的相关文章

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable  成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

虚函数被类的构造析构函数和成员函数调用虚函数的执行过程_C 语言

复制代码 代码如下: #include<iostream> class base{public:     base()    {        std::cout<<std::endl;        std::cout<<"base constructor"<<std::endl;        func1();        std::cout<<std::endl;    }     virtual ~base()   

C++中派生类的构造和析构顺序详解

派生类因为要调用基类, 所以构造和析构都是按照一定顺序进行; 构造的顺序是: 基(base) -> 派生(derived);即先构造基类, 再构造派生类; 因为 基类 是独立于派生类的, 即不会调用派生类中的对象, 所以应该先被生成; 如果派生类先于基类生成, 则因为无法调用基类资源, 可能生成失败; 析构的顺序是: 派生(derived) -> 基(base); 即先释放派生类, 再释放基类; 因为 派生类 需要先释放调用的基类资源, 所以应该优先释放; 如果基类先析构, 则有可能某些资源被

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

(多)继承中的构造与析构

(多)继承中的构造与析构 问:析构函数为何定义为虚函数较好? 答:若不这样,基类指针指向子类,再删除该指针时,子类的析构函数得不到调用,子类中比父类多的那些变量得不到回收,造成内存泄露.

构造函数不能声明为虚函数的原因及分析_C 语言

1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的.问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数. 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用.构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀.所以构造函数没有必要是虚函数.虚函数的作用在于通过父类的指

C++中的纯虚函数(pure virtual) 和抽象基类(abstract base class)

纯虚函数(pure virtual), 是一个基类中的方法, 仅仅是声明, 而不包括定义, 是一个泛化概念(general concept); 是把相应的虚函数, 末尾添加"=0",该虚函数就变为纯虚函数, 可以不用添加定义; 如果是其他虚函数, 即使不使用, 也必须定义(define); 包含纯虚函数的基类, 是抽象基类(abstract base class),不能定义(define)对象(object), 仅可以作为继承使用; 代码: /* * CppPrimer.cpp * *

C++中如何在容器中使用继承和虚函数

容器不支持混合类型, 如果直接把派生类对象, 存入基类容器中, 则无法使用派生-基转换(derived-base conversion); 因为转换只能发生在指针和引用 过程中, 不能发生在 对象直接赋值, 如果是直接转换, 则会产生截断(sliced down); 即派生类部分被切除, 只留下基类部分; 所以存入容器中的派生类 输出为基类部分 的虚函数; 如果想在容器中, 进行继承, 则需要使用指针, 包括智能指针(如:shared_ptr<>), 则会输出派生类的覆写(override)版