我不熟悉OOP,我碰巧知道,当调用派生类的构造函数(或解构函数)时,基类的构造函数(或解构函数)也被调用。但是,如果我不希望调用基本构造函数/解构函数,那么我能做什么呢?
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;
}结果是:
Base constructor called
Derived constructor called
Derived deconstructor called
Base deconstructor called发布于 2022-12-02 17:24:31
继承的部分要点是派生类的实例也是基类的实例。因此,在创建派生对象时,基类构造函数总是运行以将其建立为基类的实例。然后,派生构造函数运行以将其建立为派生类的实例。
如果您不希望基类构造函数运行,这就直接表示基类构造函数正在做它不应该做的事情,或者您不希望它成为基类的对象。
如果这个问题与基类构造函数有关,那么显然您已经修复了这个问题。
如果问题是不希望派生对象成为基类的实例,则根据问题的确切来源,您有几种可能的方法。
一个相当常见的问题是,推导一开始似乎是合理的,但实际上并非如此。许多人倾向于从相似性的角度来思考。如果一件事和另一件一样,加上一些东西,我们常常认为继承可以被合理地表示出来。它不能,我们可能根本不能使用派生,或者我们可能必须创建一个只包含95%的类似类的第三个类,作为这两个类的基础。但是,要使事物正常工作,派生类必须是基类的一个严格的超集--它必须100%地共享基类,并添加一些其他的“东西”。
继承经常被滥用和滥用,以至于当我看到这样的问题时,没有描述具体的问题,我的第一个猜测是您可能滥用了继承,所以这可能不仅仅是修复基类构造函数的问题,而是需要一个不同的层次结构的问题,或者(更有可能的)根本不应该使用继承。
发布于 2022-12-02 15:55:29
这不是java;将始终调用基ctor/dtor,因为必须建立基的不变量,并且必须执行销毁类所需的操作。如果您需要从后代以某种方式表示某些特定资源不应被释放,则需要将其作为基状态的一部分;但通常认为这是一个不好的模式。
https://stackoverflow.com/questions/74658349
复制相似问题