我正在编写两个C ++ / CLI程序集。一个程序集有一个带有一些内部虚方法的基类。另一个程序集标记为friend并包含派生类。
当我尝试覆盖内部虚拟方法时,编译器强制我将可见性级别更改为public。
发生了什么事?我为什么要这样做?
代码:
// 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
{
}
};
}
答案 0 :(得分:0)
因为FriendAssemblyBase
中的其他类可以调用BaseClass.DoSomething
。
DerivedClass.DoSomething
必须显示FriendAssemblyBase
。可能发生的唯一方法是使用public:
。