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

18

假设我有一个基类:

class baseClass  
{  
  public:  
baseClass() { };

};

还有一个派生类:

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

    };

当我创建 derClass 的一个实例时,会调用 baseClass 的构造函数。我如何防止这种情况?


1
你不需要这样做;那没有意义。你为什么认为你需要这么做呢? - GManNickG
@GMan 我有一个基类,在构造函数中准备了带有头部的数据。派生类不需要准备头部,但它调用了准备头部的基类构造函数,这会搞乱一些东西。 - Brad
6
你没有理解继承的重点。继承形成了一个“一个A是一个B”的关系。如果一个B做了一个A不应该做的事情,那么一个A就不是一个B。 - Benjamin Lindley
请阅读这篇文章。询问您试图解决的整个问题,而不是您认为需要采取的步骤。 - GManNickG
1
更改基类,而不是派生类。 - Dialecticus
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) { };

};

1
derClass() : baseClass (noprapere_tag) { }; 在这行代码中,noprapere_tag不是一个对象,你应该创建一个对象吗?
- Abhishek Agarwal

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)。您只需要确保在 Derived 构造函数中初始化所有的 Base 字段即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接