【问题标题】: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。询问您要解决的整个问题,而不是您认为需要采取的步骤。
  • 更改基类,而不是派生类。

标签: c++ class derived-class


【解决方案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   
    

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 2018-07-21
      • 2015-08-18
      • 2018-07-16
      • 2011-09-27
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 2019-04-19
      相关资源
      最近更新 更多