当前位置:编程学习 > C/C++ >>

C++陷阱:构造函数中的多态

C++中主要是通过给函数加上virtual关键字来实现多态。多态可用于改变一个接口的实现,也算是一种嵌入应用层代码到底层的实现手段。就算你用不到C++那些复杂的技术,多态肯定会被用到。

但加上virtual不一定能保证多态成功:

#include <stdio.h>

class Base {
public:
    Base() {
        Init();
    }

    virtual ~Base() {
        Release();
    }

    virtual void Init() {
        printf("Base::Init\n");
    }

    virtual void Release() {
        printf("Base::Release\n");
    }
};

class Derived : public Base {
public:
    virtual void Init() {
        printf("Derived::Init\n");
    }

    virtual void Release() {
        printf("Derived:Release\n");
    }
};

int main()
{
    Base *obj = new Derived();
    delete obj;
    return 0;
}
当在构造函数,包括析构函数中调用virtual函数时,预想中的多态是无法完成的,以上代码输出结果为:

Base::Init
Base::Release
从语言设计角度来看,我个人是不接受这种行为的。我觉得对一门语言而言,几乎所有特性都应该是一致的,不应该或尽量少地出现这种“例外“。如果我构造一个对象,让它以不同的方式被构造,这和改变它的某个行为有什么区别?(从这句话来看,似乎还真有区别)

当然,从语言实现来看,这样的运行结果又似乎是必然的。因为,基类的构造是早于派生类的(作为其一部分),只有当构造完派生类后,其用于支持多态的虚表才会被正确构造。也就是说,在基类中调用虚函数时,既然虚表都为正确构造,自然调用的不会是派生类的虚函数了。析构函数按照析构的顺序来看,也会面临同样的情况。

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,