虚函数的构造析构顺序

#include <iostream>

using namespace std;

class A {
    public:
        A() {
            cout << "A()" << endl;
        }
        virtual void vt() {
            cout << "vt A" << endl;
        }
        virtual ~A() {
            cout << "~A()" << endl;
        }
};

class B: public A {
    public:
        B(): A() {
            cout << "B()" << endl;
        }
        virtual void vt() {
            cout << "vt B" << endl;
        }
        virtual ~B() {
            cout << "~B()" << endl;
        }
};

int main() {
    B b;
    A *a;
    a = &b;
    a->vt();
    A *pa;
    B *pb = new B();
    pb->vt();
    pa = dynamic_cast<A *> (pb);
    pa->vt();
    delete pa;
    //delete pb;
} 

#include <iostream>
using namespace std;
class base {
    public:
        virtual void bar() {
            cout << "base bar" << endl;
        }
        void foo() {
            cout << "base foo" << endl;
            bar();
        }
}; 
class drive: public base {
    public:
        void bar() {
            cout << "drive bar" << endl;
        }
        void foo() {
            cout << "drive foo" << endl;
        }
};
int main() {
    base *b = new drive();
    b->foo();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 中,当创建对象时,首先会调用该类的构造函数来初始化对象成员变量和数据成员。而当对象被销毁时,会自动调用析构函数来清理对象并释放相关资源。 构造函数和析构函数的调用顺序与对象的创建和销毁顺序密切相关。对于单个对象,构造函数的调用先于析构函数。而对于多个对象,它们的构造函数和析构函数的调用顺序则取决于它们的创建和销毁顺序。 具体来说,创建对象时,构造函数的调用顺序按照成员变量的声明顺序进行,即先调用基类构造函数,再调用成员变量的构造函数,最后调用自身的构造函数。而销毁对象时,析构函数的调用顺序则与构造函数相反,即先调用自身的析构函数,再调用成员变量的析构函数,最后调用基类的析构函数。 需要注意的是,如果一个类是另一个类的成员变量,则其构造函数和析构函数的调用顺序取决于它们在类中的声明顺序。如果一个类是另一个类的基类,则其构造函数和析构函数的调用顺序与继承方式有关。如果是虚继承,则先调用最远的祖先类的构造函数,再依次调用中间类和自己的构造函数;而析构函数的调用顺序则相反,先调用自己的析构函数,再依次调用中间类和最远的祖先类的析构函数。 总之,构造函数和析构函数的调用顺序是 C++ 中一个非常重要的概念,需要开发者在编写程序时仔细考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值