繁体   English   中英

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

[英]Not calling base class constructor from derived class

假设我有一个基类:

class baseClass  
{  
  public:  
baseClass() { };

};

和一个派生类:

class derClass : public baseClass
    {  
      public:  
    derClass() { };

    };

当我创建的实例derClass的构造baseClass被调用。 我怎样才能防止这种情况?

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

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) { };

};

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

这是继承在 C++ 中如何工作的基础。

示例工作程序

#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   

向 A 构造函数添加一个true默认 bool 参数,并在 B 中传递一个false给它:

class A 
{
public:
    A(bool construct = true) { 
        if (!construct) return;
        bar(); 
    }
    virtual void bar() { cout << "A::bar" << endl; }
};

class B : public A 
{
public:
    B() : A(false) { bar(); }
    void bar() override { cout << "B::bar" << endl; }
};

int main()
{
    A a;
    B b;
}

输出:

A::bar
B::bar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM