使用C ++ / CLI和好友程序集的奇怪行为

时间:2010-08-03 14:42:28

标签: .net c++-cli

我正在编写两个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
        {
        }
    };
}

1 个答案:

答案 0 :(得分:0)

因为FriendAssemblyBase中的其他类可以调用BaseClass.DoSomething

Liskov Substitution Principle说任何可以用基类完成的事情都必须适用于每个派生类。 DerivedClass.DoSomething必须显示FriendAssemblyBase。可能发生的唯一方法是使用public: