不从派生类调用基类构造函数

Posted

技术标签:

【中文标题】不从派生类调用基类构造函数【英文标题】:Not calling base class constructor from derived class 【发布时间】:2011-05-03 04:21:04 【问题描述】:

假设我有一个基类:

class baseClass  
  
  public:  
baseClass()  ;

;

还有一个派生类:

class derClass : public baseClass
      
      public:  
    derClass()  ;

    ;

当我创建derClass 的实例时,会调用baseClass 的构造函数。我怎样才能防止这种情况发生?

【问题讨论】:

你没有;那没有意义。为什么你认为你需要这样做? @GMan 我有一个基类,其中数据是用构造函数中的标头准备的。派生类不需要准备头文件,但它正在调用正在准备头文件的基类构造函数并搞砸了一些事情。 你错过了继承点。继承形成了“A 是 B”的关系。如果 B 做了 A 不应该做的事情,那么 A 就不是 B。 请阅读this。询问您要解决的整个问题,而不是您认为需要采取的步骤。 更改基类,而不是派生类。 【参考方案1】:

基类实例是任何派生类实例的组成部分。如果您成功地构造了派生类实例,则必须 - 根据定义 - 构造所有基类和成员对象,否则派生对象的构造将失败。构造基类实例涉及调用其构造函数之一。

这是 C++ 中继承工作方式的基础。

【讨论】:

【参考方案2】:

创建一个额外的空构造函数。

struct noprapere_tag ;

class baseClass  
  
public:  
  baseClass() : x (5), y(6)  ;

  baseClass(noprapere_tag)  ; // nothing to do

protected:
  int x;
  int y;

;

class derClass : public baseClass
  
public:  
    derClass() : baseClass (noprapere_tag)  ;

;

【讨论】:

>derClass() : baseClass (noprapere_tag) ;在这一行中 noprapere_tag 不是一个对象,你不应该创建一个对象吗?【参考方案3】:

示例工作程序

#include <iostream>

using namespace std;
class A

    public:
    A()
    
        cout<<"a\n";
    
    A(int a)
    
;
class B:public A

    public:
    B() : A(10)
    
        cout<<"b\n";
    
   
;
int main()

    
    new A;
    cout<<"----------\n";
    new B;
    
    return 0;

输出

a                                                                                                        
----------                                                                                               
b   

【讨论】:

以上是关于不从派生类调用基类构造函数的主要内容,如果未能解决你的问题,请参考以下文章

C++中派生类的构造函数怎么显式调用基类构造函数?

基类构造函数真的在派生类构造函数之前调用吗

如何从派生类复制构造函数调用基类复制构造函数? [复制]

类学习

派生类的构造函数与析构函数的调用顺序

在派生构造函数中的某些代码块之后调用派生类中的基类构造函数[重复]