打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
“C++动态绑定”相关问题探讨

一、相关问题:

1. 基类、派生类的构造和析构顺序

2. 基类、派生类中virtual的取舍

二、测试代码:

#include <iostream>
class A {
public:
    A() {
        std::cout  << "A()" << std::endl;
    }
    virtual void print() { std::cout << "A print()" << std::endl; }
    virtual ~A() {
        std::cout  << "~A()" << std::endl;
    }
};
class B : public A {
public:
    B() : A(){
        std::cout  << "B()" << std::endl;
    }
    virtual void print() { std::cout << "B print()" << std::endl; }
    virtual ~B() {
        std::cout  << "~B()" << std::endl;
    }
};
void print() {

}
int main(int argc, char *argv[])
{
    A* c = new B();
    c->print();
    delete c;
    return 0;
}

 三、探讨与结论:

1. 基类、派生类的构造和析构顺序为:基类构造-派生类构造-派生类析构-基类析构

上述代码输出结果为:

2. 基类、派生类中virtual的取舍:若要实现动态绑定,基类中virtual关键字不可舍弃,派生类中virtual关键字可有可无;若基类中有关键字virtual,则普通函数调用派生类函数,析构函数先调用派生类,再调用基类;若基类中无关键字virtual,则普通函数和析构函数均只调用基类函数。

测试代码1:基类无关键字virtual

#include <iostream>
class A {
public:
    A() {
        std::cout  << "A()" << std::endl;
    }
    void print() { std::cout << "A print()" << std::endl; }
    ~A() {
        std::cout  << "~A()" << std::endl;
    }
};
class B : public A {
public:
    B() : A(){
        std::cout  << "B()" << std::endl;
    }
    virtual void print() { std::cout << "B print()" << std::endl; }
    virtual ~B() {
        std::cout  << "~B()" << std::endl;
    }
};
void print() {

}
int main(int argc, char *argv[])
{
    A* c = new B();
    c->print();
    delete c;
    return 0;
}

 输出结果为:

测试代码2:派生类无关键字virtual

#include <iostream>
class A {
public:
    A() {
        std::cout  << "A()" << std::endl;
    }
    virtual void print() { std::cout << "A print()" << std::endl; }
    virtual ~A() {
        std::cout  << "~A()" << std::endl;
    }
};
class B : public A {
public:
    B() : A(){
        std::cout  << "B()" << std::endl;
    }
    void print() { std::cout << "B print()" << std::endl; }
    ~B() {
        std::cout  << "~B()" << std::endl;
    }
};
void print() {

}
int main(int argc, char *argv[])
{
    A* c = new B();
    c->print();
    delete c;
    return 0;
}

 输出结果为:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++中成员函数的重载、覆盖与隐藏
C++一些注意点之友元函数、虚函数以及const和volatile对象
c++反射
一个函数名后面加const表示什么意思
为什么不要在构造函数中调用虚函数
C++的虚函数表
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服