C++/MFC多重继承调用基类构造函数

Posted

技术标签:

【中文标题】C++/MFC多重继承调用基类构造函数【英文标题】:C++ / MFC multiple inheritance calling base class constructor 【发布时间】:2013-02-08 11:56:18 【问题描述】:

我在 派生 类的两个构造函数定义中都收到 error C2512: 'derived' : no proper default constructor available 错误。我的代码如下所示。我该如何解决这个问题?

Class A

    int a, int b;
    A(int x, int y)
    
        sme code....
    


Class B

    int a, int b, int c;
    B(int x, int y, int Z)
    
        sme code....
    



Class derived : public A, public B

    derived(int a, int b):A(a, b)
    

    

    derived(int a, int b, int c):B(a, b, c)
    

    

【问题讨论】:

尝试公开构造函数。此外,您必须以某种方式初始化 A B 的继承副本。 error C2512: no appropriate default constructor available 的可能重复项 【参考方案1】:

其中一个问题是,在每个派生类的构造函数中,您只将适当的构造函数参数转发给两个基类中的一个。它们都没有默认构造函数,因此您需要为基类AB 的构造显式提供参数。

第二个问题是你的基类的构造函数被隐式声明为private,所以基类不能访问它们。您应该将它们设为public 或至少protected

小问题:在类定义之后,你需要放一个分号。另外,声明类的关键字是class,而不是Class

class A // <---- Use the "class" keyword

public: // <---- Make the constructor accessible to derived classes
     int a, int b; 
     A(int x, int y) 
      
         some code.... 
      
; // <---- Don't forget the semicolon

class B // <---- Use the "class" keyword

public: // <---- Make the constructor accessible to derived classes
    int a, int b, int c;
    B(int x, int y, int Z)
    
        sme code....
    
; // <---- Don't forget the semicolon


// Use the "class" keyword
class derived : public A, public B

    derived(int a, int b) : A(a, b), B(a, b, 0) // <---- for instance
    

    

    derived(int a, int b, int c) : B(a, b, c), A(a, b) // <---- for instance
    

    
;  // <---- Don't forget the semicolon

【讨论】:

【参考方案2】:

A 类和 B 类都没有默认构造函数,您需要在派生构造函数中显式初始化 A 和 B 构造函数。您未能在每个派生构造函数中初始化 A 或 B 构造函数:

derived(int a, int b):A(a, b), B(a, b, 0) 
                               ^^^



derived(int a, int b, int c):A(a, b), B(a, b, c)
                             ^^^


【讨论】:

【参考方案3】:

您的第一个派生 ctor 调用 A 的 ctor 而不是 B 的 ctor,因此编译器尝试调用 B 的默认构造函数,该构造函数不存在。

第二个派生的ctor也是一样的,但是切换A和B。

解决方案:为 A 和 B 指定默认 ctor。

【讨论】:

以上是关于C++/MFC多重继承调用基类构造函数的主要内容,如果未能解决你的问题,请参考以下文章

本周学习小结

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?

C++11 继承构造函数和委托构造函数

C++11 继承构造函数和委托构造函数

DIY一个MFC程序

生成一个派生类对象时,调用基类和派生类构造函数按啥次序