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

问题描述 投票:0回答:4

假设我有一个基类:

class baseClass  
{  
  public:  
baseClass() { };

};

还有一个派生类:

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

    };

当我创建

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

c++ class derived-class
4个回答
21
投票

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

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

};

9
投票

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

这是 C++ 中继承工作原理的基础。


1
投票

工作程序示例

#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   

0
投票

您可能想要创建一个受保护的(可能为空)默认构造函数,该构造函数将由派生类使用:

class Base {
protected:
  Base() {}

public:
  int a;
  
  Base(int x) {a = 12;}
};

class Derived : Base {
public:
  Derived(int x) {a = 42;}
};

这将阻止任何外部代码使用默认的

Base
构造函数(因此无法正确初始化
a
)。您只需要确保在
Base
构造函数中初始化所有
Derived
字段即可。

© www.soinside.com 2019 - 2024. All rights reserved.