class A {};
class B : private A {};
class C : private B
{
public:
class D : private A {}; // Error here
};
Run Code Online (Sandbox Code Playgroud)
此代码提供以下错误(在VS 2013中):
nested.cpp(8):错误C2247:'A'无法访问,因为'B'使用'private'继承'A'
如果我改变这样的定义,它会得到修复D:
class D : private ::A {};
Run Code Online (Sandbox Code Playgroud)
这是正确的行为,如果是这样,为什么?
起初我以为这是因为C私下继承B会隐藏基类.但如果我消除了"中间人"类B并且只使用它:
class A {};
class C : private A
{
public:
class D : private A {};
};
Run Code Online (Sandbox Code Playgroud)
错误消失了.
我们都知道,在使用简单单继承时,派生类的地址与基类的地址相同。多重继承使这一点变得不真实。
虚拟继承是否也使这不真实?换句话说,以下代码是否正确:
struct A {};
struct B : virtual A
{
int i;
};
int main()
{
A* a = new B; // implicit upcast
B* b = reinterpret_cast<B*>(a); // fishy?
b->i = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在应用程序中启用常用控件.我按照本MSDN文章中给出的步骤进行了操作,特别是在仅使用标准扩展的应用程序中使用ComCtl32.dll版本6的部分.但我无法让它发挥作用.
我在文章中做的唯一不同之处是我在Project Property Pages中添加了清单信息 配置属性| 链接器| 清单文件| 额外的清单依赖关系.这是我在文本框中输入的内容:
"type ='Win32'name ='Microsoft.Windows.Common-Controls'version ='6.0.0.0'processorArchitecture ='*'publicKeyToken ='6595b64144ccf1df'language ='*'xmlns =' http://schemas.microsoft. com/developer/msbuild/2003 '";%(AdditionalManifestDependencies)
当我检查生成的清单(MyApp.exe.intermediate.manifest)时,它看起来是正确的.
我还在Project Properties中为ComCtl32.lib添加了一个链接依赖项 配置属性| 链接器| 输入| 额外的依赖关系.我也在启动时调用InitCommonControlsEx,其INITCOMMONCONTROLSEX结构初始化如下:
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_STANDARD_CLASSES;
Run Code Online (Sandbox Code Playgroud)
但是对InitCommonControlsEx的调用总是返回FALSE(这意味着它失败了).经过一番调查后,我发现GetLastError返回的错误代码是ERROR_FILE_NOT_FOUND.可能是什么问题呢?
更新:我发现了一些可能与"找不到文件错误"有关的内容.当我从调试器运行应用程序时,"输出"窗口中的一行是:
'MyApp.exe':已加载'C:\ Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6002.18305_none_88f3a38569c2c436\comctl32.dll',无法找到或打开PDB文件
但是,对于一些更标准的库,如kernel32.lib,user32.lib等,有许多类似的行:
'MyApp.exe':已加载'C:\ Windows\System32 \ntdll.dll',无法找到或打开PDB文件
'MyApp.exe':加载'C:\ Windows\System32\kernel32.dll',无法找到或打开PDB文件
'MyApp.exe':加载'C:\ Windows\System32\msvcrt.dll',无法找到或打开PDB文件
'MyApp.exe':已加载'C:\ Windows\System32\user32.dll',无法找到或打开PDB文件
这些行总是出现在任何应用程序中,并且不会引起任何问题.它可能与ComCtl32.dll不同吗?
我有一个使用 ID2D1Factory::CreateDxgiSurfaceRenderTarget 创建的 Direct2D 渲染目标。当我收到 WM_SIZE 消息时,我尝试通过调用 IDXGISwapChain::ResizeBuffers 来调整相应交换链的大小,但失败并显示 DXGI_ERROR_INVALID_CALL (0x887a0001)。我相信这是因为ResizeBuffers 文档中指出的以下内容:
除非释放对其后台缓冲区的所有未完成引用,否则无法调整交换链的大小。为了使 ResizeBuffers 成功,您必须释放其对后台缓冲区的所有直接和间接引用。
在对资源调用 AddRef 后,应用程序将保留直接引用。
间接引用由对资源的视图持有,将资源的视图绑定到设备上下文、使用该资源的命令列表、使用该资源的视图的命令列表、执行使用过的另一个命令列表的命令列表。资源等等。
我假设由 ID2D1RenderTarget::CreateDxgiSurfaceRenderTarget 创建的 Direct2D 渲染目标就是这样一种间接引用。但我无法想象每次调整窗口大小时都应该重新创建渲染目标,那么我该怎么办?