我最近做了一些Windows Api编码(仍在做).我试图找到将WNDCLASSEX包装成C++类的最佳方法,当我有这个疯狂的想法时,WNDCLASSEX是一个结构对吗?(尽管它是用c编写的)并且在C++中结构被视为类,所以为什么我不将我的WinCLass声明为WNDCLASSEX的衍生物,所以我试过:
class WinClass : protected WNDCLASSEX
Run Code Online (Sandbox Code Playgroud)
它奏效了!然后我尝试使用它与SDL结构,但那些也有效.但是当我从它们派生类时,某些结构(特别是SDL结构)要么不编译或导致无法解释的运行时错误.所以我的问题是:推荐使用这种C结构吗?它实际上是专业人士使用的,还是只是一个蹩脚的黑客?我应该使用我的包装器还是应用程序,还是只会引入无法解释的错误?
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
建议您在这里查看这个答案,以明确您对继承和访问说明符规则的理解。
| 归档时间: |
|
| 查看次数: |
1967 次 |
| 最近记录: |