- 主题:MSVC特有的关键字__interface,貌似是个大坑?
文字发不出来,那就图片吧
--
FROM 114.241.228.*
__interface没有dtor,也就没有virtual dtor。作为一个继承树的根,没有virtual dtor会导致各种不析构。
--
修改:z16166 FROM 114.241.228.*
FROM 114.241.228.*
managed c++可以用,这有例子
http://www.functionx.com/vcnet/keywords/interface.htm
官方的例子貌似是COM,但有些诡异的语法,象这种。还是不进坑了。
https://docs.microsoft.com/en-us/cpp/cpp/interface?view=msvc-170
[module(name="test")];
[ object, uuid("00000000-0000-0000-0000-000000000001"), library_block ]
__interface IFace {
[ id(0) ] int int_data;
[ id(5) ] BSTR bstr_data;
};
[ coclass, uuid("00000000-0000-0000-0000-000000000002") ]
class MyClass : public IFace {
【 在 Bernstein 的大作中提到: 】
: 这是com里用的吧,应该有另外一套规则
:
--
FROM 114.241.228.*
就是顶楼的那个程序例子,Derived1的析构不会被调用。
我记得好多年前用过__interface。
不让发文本。
【 在 dormouseBHU 的大作中提到: 】
: 能举个例子吗?interface用了这么多年,没听谁说有问题。
--
FROM 114.241.228.*
不能有析构
https://docs.microsoft.com/en-us/cpp/cpp/interface?view=msvc-170
A Microsoft C++ interface can be defined as follows:
Can inherit from zero or more base interfaces.
Cannot inherit from a base class.
Can only contain public, pure virtual methods.
Cannot contain constructors, destructors, or operators.
Cannot contain static methods.
Cannot contain data members; properties are allowed.
【 在 dormouseBHU 的大作中提到: 】
: IBase1 加个析构函数不行吗?
: __interface IBase1{ void F(); ~IBase();}
:
--
FROM 114.241.228.*
不是C的,它是纯虚接口,就是面向对象的
【 在 hgoldfish 的大作中提到: 】
: 这个东东是模拟 java 的 interface 的吧。
: 是不是原本是 c 的东东?
: msvc 里面留存了一些在 c 里面模拟 com 行为的私有技术。类似的还有 __try{}
: ...................
--
FROM 160.16.102.*
跨语言是指带个gc关键字跟.net交互?
msdn上给出的例子并没说只能那么用
【 在 leadu 的大作中提到: 】
: 这个明显是给跨语言的用的东西,可以设想一下,如果有你要的虚析构,在别的语言中看这个interface的虚析构,是个啥?
: 这些都是指定内存布局的东西
:
--
FROM 114.241.228.*
你这个咋编译通过的?我vs2022直接编译msdn上原版的例子,过不了
就这个页面中的example
https://docs.microsoft.com/en-us/cpp/cpp/interface?view=msvc-170
【 在 hanjiamajia 的大作中提到: 】
:
: ...因为它是给 com 用的,隐含实现了 addref release 等引用计数方法
[upload=1][/upload]
--
FROM 114.241.228.*
你这个说得有道理,就是__interface只能和COM那套配合用
【 在 dormouseBHU 的大作中提到: 】
: 问题在于一个类可能会继承多个interface。所以不能随便用虚析构。否则delete 一个 interface 后别的 interface 也不能用了。微软故意设计成这样,delete 一个 interface 时就是要保证什么都不干。
: 为了解决析构问题,微软的 COM 实现了引用计数,只有确定所有的 interface 都不需要了之后才会调用析构函数。
:
--
FROM 114.241.228.*