使C++类继承自C Structs,推荐?

App*_*ker 7 c++ struct class

我最近做了一些Windows Api编码(仍在做).我试图找到将WNDCLASSEX包装成C++类的最佳方法,当我有这个疯狂的想法时,WNDCLASSEX是一个结构对吗?(尽管它是用c编写的)并且在C++中结构被视为类,所以为什么我不将我的WinCLass声明为WNDCLASSEX的衍生物,所以我试过:

 class WinClass : protected WNDCLASSEX
Run Code Online (Sandbox Code Playgroud)

它奏效了!然后我尝试使用它与SDL结构,但那些也有效.但是当我从它们派生类时,某些结构(特别是SDL结构)要么不编译或导致无法解释的运行时错误.所以我的问题是:推荐使用这种C结构吗?它实际上是专业人士使用的,还是只是一个蹩脚的黑客?我应该使用我的包装器还是应用程序,还是只会引入无法解释的错误?

Alo*_*ave 1

C++ 中的类和结构之间的唯一区别是访问说明符。

对于类,访问说明符默认是私有的。
对于结构体,访问说明符默认是公共的。

这意味着如果您有一个从其他类/结构派生的类,则默认情况下它将是私有继承
如果您有一个从其他类/结构派生的结构,则默认情况下它将是公共继承

但一个问题是,由于结构默认访问说明符是公共的,因此它们可能会公开不应该公开给派生类的成员。从这个意义上说,整个封装具有全新的维度。当然,如果您可以更改打算用作 Base 的结构内部的访问说明符,那么就有可能避免该问题,但这可能是不可能的,因为这可能会影响从其他部分使用该结构的方式该程序。

编辑:
通过评论,我现在有了一个公平的想法,您所指的错误是什么,这些错误并不是特别因为您是从结构中派生的,而是因为您误解了继承和访问说明符的规则。

下面是一个用于演示的示例程序:

#include<iostream>

using namespace std;

struct FirstStruct
{
    private:
        int a;
    public:
        int b;
        FirstStruct():a(10),b(20),c(30)
        {
        }
    protected:
        int c;
};

class MyClass:protected FirstStruct
{
    public: 
        int i;
        MyClass():i(40),j(50),k(60)
        {
        }
        void doSomething()
        {
            a = 100; //private in Base is not accessible in Derived
            b = 100; //Accessible
            c = 100; //Accessible  

            i = 100; //Accessible  
            b = 100; //Accessible  
            c = 100; //Accessible  
        }
    private:
        int j;
    protected:
        int k; 
};

int main()
{
    MyClass obj;
    obj.i = 100; //Accessible
    obj.j = 100; //Error Cannot be Accessed, j is private member
    obj.k = 100; //Error Cannot be Accessed, k is protected member
    obj.a = 100; //Error Cannot be Accessed, a is private member in Base Class
    obj.b = 100; //Error Cannot be Accessed; 
                 //b is protected member of MyClass, because of protected Inheritance
    obj.c = 100; //Error Cannot be Accessed; 
                 //same reason as b


    obj.doSomething();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以在 Ideone上检查是否运行相同的内容。
您会注意到,即使您将 Base 的类型从此处struct FirstStruct更改为此处,您也会遇到相同的错误(仅此而已)。class FirstStruct

建议您在这里查看这个答案,以明确您对继承和访问说明符规则的理解。