首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >派生构造函数而不调用基构造函数

派生构造函数而不调用基构造函数
EN

Stack Overflow用户
提问于 2022-12-02 15:53:23
回答 2查看 52关注 0票数 0

我不熟悉OOP,我碰巧知道,当调用派生类的构造函数(或解构函数)时,基类的构造函数(或解构函数)也被调用。但是,如果我不希望调用基本构造函数/解构函数,那么我能做什么呢?

代码语言:javascript
复制
class Base{
    public:
    
    Base(){
        cout<<"Base constructor called\n";
    }
    ~Base(){
        cout<<"Base deconstructor called\n";
    }
};
class Derived: public Base{
    public:
    Derived(){
        cout<<"Derived constructor called\n";
    }
    ~Derived(){
        cout<<"Derived deconstructor called\n";
    }
};
int main()
{
    Derived* obj_a = new Derived;
    delete obj_a;

    return 0;
}

结果是:

代码语言:javascript
复制
Base constructor called
Derived constructor called
Derived deconstructor called
Base deconstructor called
EN

回答 2

Stack Overflow用户

发布于 2022-12-02 17:24:31

继承的部分要点是派生类的实例也是基类的实例。因此,在创建派生对象时,基类构造函数总是运行以将其建立为基类的实例。然后,派生构造函数运行以将其建立为派生类的实例。

如果您不希望基类构造函数运行,这就直接表示基类构造函数正在做它不应该做的事情,或者您不希望它成为基类的对象。

如果这个问题与基类构造函数有关,那么显然您已经修复了这个问题。

如果问题是不希望派生对象成为基类的实例,则根据问题的确切来源,您有几种可能的方法。

一个相当常见的问题是,推导一开始似乎是合理的,但实际上并非如此。许多人倾向于从相似性的角度来思考。如果一件事和另一件一样,加上一些东西,我们常常认为继承可以被合理地表示出来。它不能,我们可能根本不能使用派生,或者我们可能必须创建一个只包含95%的类似类的第三个类,作为这两个类的基础。但是,要使事物正常工作,派生类必须是基类的一个严格的超集--它必须100%地共享基类,并添加一些其他的“东西”。

继承经常被滥用和滥用,以至于当我看到这样的问题时,没有描述具体的问题,我的第一个猜测是您可能滥用了继承,所以这可能不仅仅是修复基类构造函数的问题,而是需要一个不同的层次结构的问题,或者(更有可能的)根本不应该使用继承。

票数 2
EN

Stack Overflow用户

发布于 2022-12-02 15:55:29

这不是java;将始终调用基ctor/dtor,因为必须建立基的不变量,并且必须执行销毁类所需的操作。如果您需要从后代以某种方式表示某些特定资源不应被释放,则需要将其作为基状态的一部分;但通常认为这是一个不好的模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74658349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档