【发布时间】:2010-08-03 14:42:27
【问题描述】:
我正在编写两个 C++/CLI 程序集。一个程序集有一个带有一些内部虚拟方法的基类。另一个程序集被标记为友元并包含派生类。
当我尝试覆盖内部虚拟方法时,编译器强制我将可见性级别更改为公共。
发生了什么事?为什么我必须这样做?
代码:
// Assembly 1 "FriendAssemblyBase"
namespace FriendAssemblyTest
{
public ref class BaseClass
{
internal:
BaseClass()
{
}
virtual void DoSomething()
{
}
};
}
// Allow "FriendAsseblyDerived" to see internals
[assembly: ::System::Runtime::CompilerServices::InternalsVisibleToAttribute(
"FriendAssemblyDerived, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a95fe809ecc53c3a826aa32e3ab1309f2ecae4b91dc649457d704e150f3a4007a151ffe28852f947803dd1a1586c5c0ae2c9688bd76299857ee65ff7efb14905e03b33664a42e2fa1074080c3bad971623514ab6dd9fc4e4343ba7fb98884ecce45f96b71e5f1b55de88e36483274aa71c740fdfb14aacaada6ca22cb39bf9a2")];
// ----------------
// Assembly 2. "FriendAssemblyDerived". Strongly named and signed
#using "FriendAssemblyBase.dll" as_friend
namespace FriendAssemblyTest
{
public ref class Derived : BaseClass
{
public:
Derived() {}
void Foo()
{
DoSomething();
}
internal: // <-- Causes C3252 (cannot reduce visibility of virtuals)
virtual void DoSomething() override
{
}
};
}
【问题讨论】:
-
您能否提供一对虚拟类来演示您的类如何相互派生/包含?
-
我添加了一些代码来说明。
-
“发布属性声明”的哪一部分不清楚?再见。
-
添加了“属性声明”。不确定该细节将如何帮助任何人回答问题...